考虑以下测试程序:
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::cout << sizeof(std::string("hi")) << " ";
std::string a[10];
std::cout << sizeof(a) << " ";
std::vector<std::string> v(10);
std::cout << sizeof(v) + sizeof(std::string) * v.capacity() << "\n";
}
libstdc++
和 libc++
的输出分别为:
8 80 104
24 240 264
如您所见, libc++
占用的内存是简单程序的 3 倍。导致这种内存差异的实现有何不同?我需要担心吗?我该如何解决?
原文由 user4390444 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是一个简短的程序,可帮助您探索
std::string
的两种内存使用情况:堆栈和堆。使用 http://melpon.org/wandbox/ 很容易获得不同编译器/lib 组合的输出,例如:
海合会 4.9.1:
gcc 5.0.0:
铿锵声/libc++:
VS-2015:
(最后一行来自 http://webcompiler.cloudapp.net )
上面的输出还显示了
capacity
,这是一个衡量char
字符串在必须从堆中分配一个新的、更大的缓冲区之前可以容纳的量度。对于 gcc-5.0、libc++ 和 VS-2015 实现,这是对 短字符串缓冲区 的度量。也就是说,在堆栈上分配的大小缓冲区用于保存短字符串,从而避免了更昂贵的堆分配。似乎 libc++ 实现具有最小的(堆栈使用)短字符串实现,但包含最大的短字符串缓冲区。如果计算 总 内存使用量(堆栈 + 堆),libc++ 在所有 4 个实现中,这个 2 字符字符串的总内存使用量最小。
应该注意的是,所有这些测量都是在 64 位平台上进行的。在 32 位上,libc++ 堆栈使用量将下降到 12,小字符串缓冲区下降到 10。我不知道 32 位平台上其他实现的行为,但您可以使用上面的代码找出.