std::string SSO 调整

2023-12-26

是否可以调std::string 小/短字符串优化 https://stackoverflow.com/questions/10315041/meaning-of-acronym-sso-in-the-context-of-stdstring不知何故?

例如,如果我必须处理很多很短但长度超过 15 个字符的字符串(例如lastname + ", " + firstname + ", " + middlename其长度通常在[20; 40]).

Upd:

根据this https://stackoverflow.com/questions/21694302/what-are-the-mechanics-of-short-string-optimization-in-libc看起来答案是否定的。但当我打开时basic_string.h文件我发现了这个:

template<typename _CharT, typename _Traits, typename _Alloc>
    class basic_string
    {
    ...
    enum { _S_local_capacity = 15 / sizeof(_CharT) };

    union
    {
  _CharT           _M_local_buf[_S_local_capacity + 1];
  size_type        _M_allocated_capacity;
    ...
    };

所以现在还不清楚为什么_S_local_capacity是这样硬编码的...


“短字符串优化”的整个想法是,它“不占用额外的空间。因此,计算大小时,本地缓冲区会覆盖类中字符串较长时使用的其他变量。

修改系统头文件不是一个好主意,因为它们通常依赖于编译器版本,并且存在使其“二进制不兼容”的实现细节。

正如评论所说,在采取任何措施之前,请确保这确实是一个问题(性能或其他)。然后仔细考虑你应该采取什么措施。您想解决什么问题,您确定值得这样做吗?请记住,如果您执行以下操作:

 std::string func(std::string arg)
 {
   ...
 }

您将在传递时复制更多字节arg在堆栈上。不,这并没有真正帮助实现它const std::string& arg如果您的调用代码创建了一个临时字符串,例如func("Name: " + name);。如果你这样做vector<std::string>,每个的大小都会更大,因此向量将占用更多空间 - 即使对于字符串仍然不适合的情况,因此当您增大/缩小向量时将花费更多时间。

我认为,一旦您做出决定,正确的解决方案就是实现您自己的字符串类。std::string是一个标准模板库类,它们不可扩展,并且您不应该修改标准库头文件,因为正如我之前所说,它高度依赖于编译器。要使其完全兼容需要做相当多的工作std::string,但你当然可以“作弊”并制作转换器功能operator std::string()对于您的字符串类,因此您只需要生成更基本的函数std::string offers.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::string SSO 调整 的相关文章

随机推荐