c++ - std::string SSO 调整

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

是否可以调整 std::string Small/Short String Optimization不知何故?

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

更新:

根据 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 是硬编码的...

最佳答案

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

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

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

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

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

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

关于c++ - std::string SSO 调整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33773834/

相关文章:

c++ - 如何在构建单线程库时删除 pthread undefined reference

c++ - 什么是函数的左值引用?

c++ - 如何自动生成设置/选项对话框?

字符指针赋值段错误

C++ std::string 内部内存处理

windows - MinGW g++ : Multiple definition of vsnprintf when using to_string

c++ - 如何获得在 Mac OS X 上运行的 Homebrew 版本的 GDB?

c++ - C 与 Python - 条件语句中的运算符优先级

c# - 为什么默认情况下用户不能在输入中输入转义序列?

C++ 对线程感到困惑