【问题标题】:String class allocating on stack for small strings?字符串类在堆栈上为小字符串分配?
【发布时间】:2011-07-22 02:23:09
【问题描述】:

有谁知道是否有一个兼容 STL 接口的字符串类,它为堆栈上的小字符串(达到一定阈值)和大字符串分配堆内存?

我正在寻找优化程序,并且我正在使用可以轻松放入堆栈而不是在堆上分配的小本地字符串。

【问题讨论】:

  • Visual Studio 有这个优化(对于非常小的字符串,只有几个字符),而 gcc 更喜欢 Copy-On-Write。
  • 我们使用 Visual Studio 2010,您是否可以在任何地方阅读有关此优化的信息(MSDN 或其他地方)?
  • 如果你有足够新的版本,大多数编译器都会这样做。
  • 查了一下,它在 VS 2010 中似乎是 16 个字节,没有选项可以将其设置为其他任何值。

标签: c++ string stl memory-management wstring


【解决方案1】:

这是一个古老的问题,但我觉得这比当前的任何答案都好。

http://llvm.org/docs/ProgrammersManual.html#dss_smallstring

基本上这是你想要的。 顺便说一句,tcmalloc 在我的(设计糟糕的 :D)字符串分配密集型程序中提高了 10% 的性能。 此外,您应该配置文件以证明 allocs 是您的性能问题。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      gcc 的 vstring (__versa_string) 实现可以进行小字符串优化,并具有标准字符串接口。如果您碰巧使用 gcc,那么包含 ext/vstring 就很容易了。否则,您也许可以将其适应您的编译器/环境。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • std::string 的一些实现会这样做,它被称为小字符串优化。一个快速的谷歌应该会告诉你是否有,或者你是否可以使用其他替代方法。
        最近更新 更多