我如何分配的一种标准::string上堆使用glibc的串的执行?
题
int main(void)
{
std::string foo("foo");
}
我的理解是,上述代码使用的缺省分配器以呼叫新。因此,即使std::string foo分配叠的内部缓冲区内的foo是分配上的堆。
我怎么可以创建一串的分配完全在栈?
解决方案
我最近想自己做这件事,并发现以下代码很有启发性:
它定义了一个新的 std::allocator
它可以为STL容器的初始存储分配提供基于堆栈的分配。我最终找到了一种不同的方法来解决我的特定问题,所以我自己实际上并没有使用该代码,但也许它对您有用。请务必阅读代码中有关使用和注意事项的注释。
对于那些质疑这样做的实用性和理智性的人,请考虑:
- 通常,您先验地知道字符串具有合理的最大大小。例如,如果字符串要存储十进制格式的 32 位整数,您知道不需要超过 11 个字符即可完成此操作。在这种情况下,不需要可以动态增长到无限大小的字符串。
- 在许多情况下,从堆栈分配比从堆分配更快。
- 如果频繁创建和销毁字符串(假设它是常用实用函数中的局部变量),则从堆栈而不是堆进行分配将避免堆分配器中导致碎片的混乱。对于使用大量内存的应用程序来说,这可能会改变游戏规则。
有些人评论说,使用基于堆栈的分配的字符串不会是 std::string
好像这在某种程度上削弱了它的效用。确实,你不能互换使用两者,所以你将无法通过你的 stackstring
到期望的函数 std::string
. 。但是(如果你做得正确),你将能够在你的 stackstring
你现在使用的 std::string
, , 喜欢 find_first_of()
, append()
, , ETC。 begin()
和 end()
仍然可以正常工作,因此您将能够使用许多 STL 算法。当然不会 std::string
从最严格的意义上来说,但在实际意义上它仍然是一个“字符串”,并且它仍然非常有用。
其他提示
的问题是,std::basic_string
具有用于分配器的模板的参数。但std::string
不是模板和没有参数。
所以,你可以在原则上使用std::basic_string
的实例化与堆栈上使用的内存分配器,但它不会是一个std::string
。特别是,你不会得到运行时多态性,并且你不能得到的对象传递到期待std::string
功能。
你不能。除了...
std::string
是一个实例的
std::basic_string<class CharType,
class Traits=char_traits<CharType>,
class Allocator=allocator<CharType> >
你可以想象的定义分配程序的类使用 alloca 对于存管理。这只会的工作,如果分配程序本身, basic_string
方法,援引它直接或间接地都是 inline
.一个 basic_string
目创建的这个分配程序不会 可 一个 std::string
, 但这会表现(主要)喜欢它。然而,这将是一个公平的工作量有限的收益。具体而言,使用这类返回值功能将一种职业限制性的移动。
我不知道 为什么 您或其他任何人会想要这样做。
我怀疑你为什么要去做做这样的事情是很难做到的,我不知道?要分配一些完全堆栈,编译器需要在编译时知道的事情的确切大小是什么 - 在你的例子就需要知道不仅std::string
元数据的大小,而且字符串数据的大小本身。这是不是太灵活,你可能需要根据你想要它包含字符串数据的大小不同的字符串类型 - 不,这将是不可能做到的,只是它会倾向于事情有点复杂。
- std::string 将始终使用 new/delete 管理其内部存储。
- 不确定您的问题为何包含 glibc的字符串实现. 。c++标准库的字符串实现与 glibc.
- 在堆栈上存储字符串的唯一方法是在堆栈上使用 C 字符数组(就像 Shhnap 概述的那样)。但这可能不是您想要的:-)