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_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
概念主要是为游泳池设计的,但我认为它也应该涵盖这个.
看起来像C++ 0x中的rvalue-reference移动语义可能使写入成为可能inline_allocator
,如果重写了字符串库,那么basic_string
使用其分配器的移动构造函数而不是复制构造函数.有谁知道这个结果的前景如何?
我的应用程序需要每秒构建一百万个微小的ASCII字符串,所以我最终编写了自己的固定长度字符串类Boost.Array
,它工作正常,但这仍然困扰着我.
这通常是不必要的.它被称为"短字符串优化",大多数实现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个字符的空间,虽然我看了一段时间,所以我不能发誓(跟踪其标题中的大部分内容往往是一个痛苦,所以我宁愿避免看我是否可以).
在任何情况下,我都会给你一个很好的机会,你已经参与了那个非常流行的传递时间,称为过早优化.
归档时间: |
|
查看次数: |
5606 次 |
最近记录: |