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

标签 c++ memory heap-memory stdstring stack-memory

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

我的理解是上面的代码使用了默认的分配器来调用new。因此,即使 std::string foo 是在堆栈上分配的,foo 内部的内部缓冲区也是在堆上分配的。

如何创建一个完全在堆栈上分配的字符串?

最佳答案

我最近想自己做这个,发现下面的代码很有启发性:

Chronium's stack_container.h

它定义了一个新的std::allocator,它可以为STL容器的初始存储分配提供基于堆栈的分配。我最终找到了一种不同的方法来解决我的特定问题,所以我自己并没有真正使用代码,但也许它对你有用。请务必阅读代码中有关用法和注意事项的注释。

对于那些质疑这样做的实用性和合理性的人,请考虑:

  • 您通常会先验地知道您的字符串具有合理的最大大小。例如,如果字符串要存储一个十进制格式的 32 位整数,您知道这样做不需要超过 11 个字符。在这种情况下,不需要可以动态增长到无限大小的字符串。
  • 在许多情况下,从堆栈分配比从堆分配更快。
  • 如果字符串被频繁地创建和销毁(假设它是常用实用函数中的局部变量),从堆栈而不是堆分配将避免在堆分配器中导致碎片化的搅动。对于使用大量内存的应用程序,这可能会改变游戏规则。

有些人评论说,使用基于堆栈的分配的字符串不会是 std::string 好像这会以某种方式降低它的实用性。确实,您不能互换使用这两者,因此您将无法将 stackstring 传递给需要 std::string 的函数。但是(如果你做对了),你将能够在 stackstring 上使用你现在在 std::string 上使用的所有相同的成员函数,例如 find_first_of()append()begin()end() 仍然可以正常工作,所以你'将能够使用许多 STL 算法。当然,它不会是最严格意义上的 std::string,但在实际意义上它仍然是一个“字符串”,它仍然非常有用。

关于c++ - 如何使用 glibc 的字符串实现在堆栈上分配 std::string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/783944/

相关文章:

c++ - 如何更改 Qt Designer 中按钮框内按钮的属性?

c++ - 错误: redefinition of function template (or C2995)

c++ - 这是 std::vector 的正常行为吗?

java - 各种 Sun JVM 的默认最大堆大小是多少?

java - 堆外内存和栈内存是一样的吗?

java - 如何为通过 "gradle run"启动的 Java 应用程序设置最大堆大小 (-Xmx)?

c++ - 如何以低于相机每秒帧数的能力处理数据?

c# - Unity3D调用外部dll

c - SPI 闪存编程问题

python - close() 在 matplotlib savefig 之后不释放内存