String类对于小字符串是否在栈上分配内存?

10

有没有一个STL接口兼容的字符串类,可以在栈上分配小字符串的内存(达到一定阈值)并在堆上为较大的字符串分配内存?

我正在寻求对程序进行优化,使用了许多小型本地字符串,这些字符串很容易适合栈上,而不是在堆上分配。


2
Visual Studio具有这种优化(针对非常小的字符串,仅几个字符),而gcc则更喜欢写时复制(Copy-On-Write)。 - Matthieu M.
我们使用的是Visual Studio 2010,你可以在哪里阅读到这方面的优化信息(MSDN或其他地方)? - ROAR
1
大多数编译器都可以做到这一点,如果你有足够新的版本。 - Bo Persson
查了一下,似乎在VS 2010中它是16字节,没有设置为其他大小的选项。 - ROAR
4个回答

2

您可以为std::basic_string提供自定义分配器(它是第三个模板参数)。这个答案解释了如何使用它,并链接到一个可用的堆栈分配器实现。


4
有些 std::string 的实现采用了小字符串优化,你可以快速谷歌一下看一下自己使用的 std::string 是否采用该优化方式,或者是否有其他可供选择的替代方案。 - Pete

2
这是一个古老的问题,但我认为这比任何当前答案都要好。 基本上这就是你想要的。顺便说一下,tcmalloc 在我的(设计不良:D)字符串分配密集型程序中提高了10%的性能。此外,您应该进行分析以证明分配是您的性能问题。 参考链接:http://llvm.org/docs/ProgrammersManual.html#dss_smallstring

1

gcc 的 vstring (__versa_string) 实现可以进行小字符串优化,并具有 std string 接口。如果您恰好使用的是 gcc,则很容易包含 ext/vstring。否则,您可能需要将其适应于您的编译器/环境。


0

__versa_string SSO版本可以在堆栈上存储不超过15个字节,如果它超过了,无论字符串大小是多少,它都会保留16个字节 (http://codepad.org/2M7N9cTu)。

http://www.and.org/ustr/ 可以重复使用堆栈缓冲区,但我在 Debian Wheezy 64位下与它链接时遇到了问题。

http://freecode.com/projects/str-class 可以重复使用堆栈缓冲区。

我编写了一个仅使用四个字节并且可以重复使用堆栈缓冲区的头文件字符串类: http://code.google.com/p/libglim/source/browse/trunk/gstring.hpp
它具有有限的STL兼容性:基本的 basic_streambuf 实现用于与 std::ostream 配合使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接