std :: string没有空闲的内存分配

Jam*_*ock 33 c++ memory-management stdstring c++11

我有一个非常相似的问题

如何使用glibc的字符串实现在堆栈上分配std :: string?

但我认为值得重新询问.

我想要一个std::string溢出到免费商店的本地存储.std::basic_string提供一个分配器作为模板参数,所以看起来要做的就是用本地存储编写一个分配器并用它来参数化basic_string,如下所示:

std::basic_string<
char, 
std::char_traits<char>, 
inline_allocator<char, 10> 
> 
x("test");
Run Code Online (Sandbox Code Playgroud)

我试着编写一个inline_allocator可以按照你期望的方式工作的类:它为存储保留10个字节,如果basic_string需要超过10个字节,则调用::operator new().我无法让它发挥作用.在执行上面的代码行的过程中,我的GCC 4.5标准字符串库调用了复制构造函数inline_allocator4次.我不清楚是否有一种合理的方法来编写复制构造函数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_stringstd::allocator概念是否存在严重缺陷?我的意思是,似乎这应该是一个非常基本和简单的用例std::basic_stringstd::allocator.我想这个std::allocator概念主要是为游泳池设计的,但我认为它也应该涵盖这个.

看起来像C++ 0x中的rvalue-reference移动语义可能使写入成为可能inline_allocator,如果重写了字符串库,那么basic_string使用其分配器的移动构造函数而不是复制构造函数.有谁知道这个结果的前景如何?

我的应用程序需要每秒构建一百万个微小的ASCII字符串,所以我最终编写了自己的固定长度字符串类Boost.Array,它工作正常,但这仍然困扰着我.

tem*_*def 16

编写"现代C++设计"的C++程序员非凡的Andrei Alexandrescu曾写过一篇关于使用可定制存储系统构建不同字符串实现的精彩文章.他的文章(在此处链接)描述了如何将上面描述的内容作为一个更通用的系统的特例,它可以处理各种聪明的内存分配要求.这并没有太多关注std::string并且更多地关注完全自定义的字符串类,但您可能希望调查它,因为实现中有一些真正的宝石.


Mat*_* M. 10

C++ 2011真的会帮助你:)

事实是,allocatorC++ 03 中的概念已经瘫痪.其中一个要求是类型的分配器A应该能够从类型的任何其他分配器中释放内存A......不幸的是,这个要求也与每个连接到它自己的池的有状态分配器不一致.

Howard Hinnant(管理C++委员会的STL子组并从头开始为C++ 0x实现新的STL)已经在他的网站上探索了基于堆栈的分配器,你可以从中获得灵感.


Jer*_*fin 6

这通常是不必要的.它被称为"短字符串优化",大多数实现std::string已经包含它.它可能很难找到,但无论如何它通常都存在.

例如,这sso_string_base.h是MinGW 的相关部分:

  enum { _S_local_capacity = 15 };

  union
  {
_CharT           _M_local_data[_S_local_capacity + 1];
size_type        _M_allocated_capacity;
  };
Run Code Online (Sandbox Code Playgroud)

_M_local_data成员是相关的一个 - 用于存储(最多)15个字符(加上NUL终结符)的空间,而不在堆上分配任何空间.

如果内存服务,VC++附带的Dinkumware库分配20个字符的空间,虽然我看了一段时间,所以我不能发誓(跟踪其标题中的大部分内容往往是一个痛苦,所以我宁愿避免看我是否可以).

在任何情况下,我都会给你一个很好的机会,你已经参与了那个非常流行的传递时间,称为过早优化.