如何控制字符串在堆栈中而不是在堆中分配的大小?
How do I control the size at which strings get allocated in the stack rather than the heap?
是否有字符串库中的控件,我可以更改,以便在堆栈中分配更大的字符串?我想试验一下改变分配策略后的性能差异。我的假设是,允许在堆栈中分配更大的字符串可能会提高性能。
你的问题假设已经在堆栈上分配了较小的字符串。我怀疑标准是否指定了这样的行为(至少我在那里找不到),所以即使某些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
的模板参数。
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 控制允许动态运行c++的并发操作数
- 从控制台中删除最后打印的元素
- 如何控制运算符 [] 分配的值
- 如何根据模板参数控制内存分配
- 安置新的和第三方控制的分配
- 从用户控制的内存池中分配和实例化对象
- 控制 std::向量重新分配
- 为什么shared_ptr<>必须分别分配控制块和托管对象?
- 取消分配控制台上的内存关闭事件
- 如何控制字符串在堆栈中而不是在堆中分配的大小?
- 如何在分配新块时控制' std::deque '的块大小
- 分配伙伴窗口旋转控制- ResEdit (c++)