std :: string SSO调优

时间:2015-11-18 07:11:01

标签: c++ string g++ libstdc++

是否有可能以某种方式调整std::string Small/Short String Optimization

例如,如果我必须使用很多非常短的字符串但长度超过15个字符(例如lastname + ", " + firstname + ", " + middlename,其长度通常在[20; 40]范围内)。

UPD:

根据this看起来答案是否定的。但是当我打开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以这种方式硬编码......

1 个答案:

答案 0 :(得分:3)

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

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

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

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

您将在堆栈上传递arg时复制更多字节。不,如果您的调用代码创建一个临时字符串,例如,它就不会真正帮助它const std::string& argfunc("Name: " + name);。如果你做vector<std::string>,每个的大小会更大,所以向量将占用更多空间 - 即使对于字符串STILL不适合的情况,因此当你增长/收缩时会有更多的时间矢量。

我认为,一旦做出决定,正确的解决方案就是实现自己的字符串类。 std::string是一个标准的模板库类,它们不是可扩展的,你不应该修改标准库头文件,就像我之前说过的那样,它依赖于编译器。要使它与std::string完全兼容将会有一些工作,但你当然可以“欺骗”并为你的字符串类创建转换器函数operator std::string(),所以你只需要产生更基本的std::string提供的功能。