如何控制在堆栈中而不是堆中分配字符串的大小?

时间:2014-07-10 17:09:19

标签: c++ string visual-c++ stl

我可以更改字符串库中的控件,以便在堆栈中分配更大的字符串吗?我想在改变分配策略时尝试性能差异。我的假设是允许在堆栈中分配更大的字符串可以提高性能。

2 个答案:

答案 0 :(得分:0)

您的问题假设已在堆栈上分配了较小的字符串。我怀疑标准是否指定了这种行为(至少我在那里找不到)所以即使C ++标准库的某些实现使用这种技术,它也是特定于实现的。并且在没有指定库的特定版本的情况下询问这样的问题没有多大意义。

答案 1 :(得分:0)

很明显,改变短字符串优化阈值会改变std::string的ABI,因为它会改变字符串对象的足迹。出于这个原因,如果您能够更改SSO阈值,那么您将需要使该类型的阈值部分(在这种情况下它不是std::string)或确保每个目标文件使用相同的阈值设置进行编译。

实际上,MSVC甚至没有提供是否启用SSO的设置; STL explains here微软图书馆团队对潜在的缺点持谨慎态度:

  

能够启用或禁用此功能当然有用 - 但是,它也可能是问题的根源。 _SECURE_SCL和_HAS_ITERATOR_DEBUGGING选项更改了STL容器的表示(它对std :: string的作用更加微妙和混乱),因此链接到单个二进制文件的所有转换单元必须使用相同的设置进行编译,并且通过的二进制文件必须使用相同的设置编译周围的STL容器和迭代器。这已经给客户带来了问题,_SMALL_STRING_OPTIMIZATION开关会加剧这种问题。

     

这并不是说我们不会实施这样的转变 - 只是这样做不会产生负面影响。

如上所述,STLPort允许您通过预处理程序标志_STLP_USE_SHORT_STRING_OPTIM启用或禁用SSO。我不知道任何STL实现允许您通过预处理器定义或模板参数来调整SSO阈值,但是通过修改现有的STL兼容string来自行完成此操作应该相对简单。 ;除了供应商的STL之外,还有很多可供选择的(STLPort,BSL,libc ++)。

例如,在BSL中,SSO缓冲区为calculated from a minimum required size

    SHORT_BUFFER_MIN_BYTES  = 20, // minimum required size of the short
                                  // string buffer in bytes

您需要将此更改为预处理器定义或从额外参数传递到basic_string的模板参数。