【发布时间】:2011-07-26 10:56:09
【问题描述】:
我有一个非常相似的问题
How do I allocate a std::string on the stack using glibc's string implementation?
但我认为值得再问一次。
我想要一个带有本地存储的std::string,它会溢出到免费存储中。 std::basic_string 提供了一个分配器作为模板参数,所以看起来要做的事情就是写一个带有本地存储的分配器并使用它来参数化basic_string,如下所示:
std::basic_string<
char,
std::char_traits<char>,
inline_allocator<char, 10>
>
x("test");
我尝试编写inline_allocator 类,它可以按照您期望的方式工作:它保留10 个字节用于存储,如果basic_string 需要超过10 个字节,那么它调用::operator new()。我无法让它工作。在执行上面这行代码的过程中,我的 GCC 4.5 标准字符串库调用了 inline_allocator 的复制构造函数 4 次。我不清楚是否有一种明智的方法可以为inline_allocator 编写复制构造函数。
在另一个 StackOverflow 线程中,Eric Melski 提供了这个指向 Chromium 中的类的链接:
http://src.chromium.org/svn/trunk/src/base/stack_container.h
这很有趣,但它不是std::string 的直接替代品,因为它将std::basic_string 包装在一个容器中,因此您必须调用重载的operator->() 才能访问std::basic_string。
我找不到任何其他解决此问题的方法。莫非没有好的解决办法?如果这是真的,那么std::basic_string 和std::allocator 的概念是否存在严重缺陷?我的意思是,对于std::basic_string 和std::allocator,这似乎应该是一个非常基本和简单的用例。我想std::allocator 的概念主要是为池设计的,但我认为它也应该涵盖这一点。
如果重写字符串库以便basic_string 使用其分配器的移动构造函数而不是复制构造函数。有谁知道这个结果的前景是什么?
我的应用程序需要每秒构造一百万个微小的 ASCII 字符串,所以我最终编写了自己的基于 Boost.Array 的固定长度字符串类,效果很好,但这仍然困扰着我。
【问题讨论】:
-
作为过去与自定义分配器搏斗的人,我很想听听权威人士就这个话题发表讲话。
-
+1 表示“免费商店”。哦,因为这是一个很好的问题。
-
Generic: A Policy-Based basic_string Implementation 的链接是关于 basic_string 存储的精彩讨论。不过,我仍然想知道是否可以在我的问题中编写
inline_allocator类。简要浏览一下 Alexandresu 的文章并不能告诉我答案,我得花点时间了解它。 -
Chromium 的 stack_container.h 的链接已失效。这是一个更新的:src.chromium.org/viewvc/chrome/trunk/src/base/containers/…
标签: c++ c++11 memory-management stdstring