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

How do I control the size at which strings get allocated in the stack rather than the heap?

本文关键字:分配 控制 字符串 何控制 堆栈      更新时间:2023-10-16

是否有字符串库中的控件,我可以更改,以便在堆栈中分配更大的字符串?我想试验一下改变分配策略后的性能差异。我的假设是,允许在堆栈中分配更大的字符串可能会提高性能。

你的问题假设已经在堆栈上分配了较小的字符串。我怀疑标准是否指定了这样的行为(至少我在那里找不到),所以即使某些c++标准库的实现使用了这种技术,它也会是特定于实现的。而不指明库的具体版本而提出这样的问题是没有多大意义的。

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

实际上,MSVC甚至根本没有提供是否启用SSO的设置;STL在这里解释说,微软库团队对潜在的缺点持谨慎态度:

能够启用或禁用此功能当然是有用的-然而,它也可能是问题的来源。_SECURE_SCL和_HAS_ITERATOR_DEBUGGING选项改变了STL容器的表示(它对std:: string的作用更加微妙和令人困惑),因此链接到单个二进制文件中的所有翻译单元都必须使用相同的设置进行编译,传递STL容器和迭代器的二进制文件必须使用相同的设置进行编译。这已经给客户带来了问题,而_SMALL_STRING_OPTIMIZATION开关会加剧问题。

这并不是说我们永远不会实现这样的开关-只是这样做不会没有负面影响。

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

例如,在BSL中,SSO缓冲区是从最小所需大小计算的:

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

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