int main(void)
{
   std::string foo("foo");
}

我的理解是,上述代码使用的缺省分配器以呼叫新。因此,即使std::string foo分配叠的内部缓冲区内的foo是分配上的堆。

我怎么可以创建一串的分配完全在栈?

有帮助吗?

解决方案

我最近想自己做这件事,并发现以下代码很有启发性:

Chronium 的 stack_container.h

它定义了一个新的 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 概述的那样)。但这可能不是您想要的:-)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top