gpt4 book ai didi

c++ - 没有空闲存储内存分配的 std::string

转载 作者:IT老高 更新时间:2023-10-28 12:37:40 25 4
gpt4 key购买 nike

我有一个非常相似的问题

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_stringstd::allocator 概念是否存在严重缺陷?我的意思是,这似乎应该是 std::basic_stringstd::allocator 的一个非常基本和简单的用例。我想 std::allocator 概念主要是为池设计的,但我认为它也应该涵盖这一点。

如果重新编写字符串库以使 basic_string使用其分配器的移动构造函数而不是复制构造函数。有谁知道这个结果的前景是什么?

我的应用程序需要每秒构造一百万个微小的 ASCII 字符串,所以我最终编写了自己的基于 Boost.Array 的固定长度字符串类,效果很好,但这仍然很麻烦我。

最佳答案

Andrei Alexandrescu,杰出的 C++ 程序员,撰写了“现代 C++ 设计”,曾经写过一篇关于使用可定制存储系统构建不同字符串实现的精彩文章。他的文章 (linked here) 描述了如何执行上述操作,这是一个更通用的系统的特例,可以处理各种巧妙的内存分配要求。这并没有过多地谈论 std::string,而是更多地关注完全自定义的字符串类,但您可能需要研究它,因为在实现中有一些真正的 gem 。

关于c++ - 没有空闲存储内存分配的 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5492816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com