int main(void)
{
std::string foo("foo");
}
我的理解是上面的代码使用了默认的分配器来调用new。因此,即使 std::string foo 是在堆栈上分配的,foo 内部的内部缓冲区也是在堆上分配的。
如何创建一个完全在堆栈上分配的字符串?
最佳答案
我最近想自己做这个,发现下面的代码很有启发性:
它定义了一个新的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/