EDITED 该代码在VS2010中以Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
编译为32位,并在Win7 64位机器上运行。为什么插入空结构保留向量增加内存?
程序为空main
机身需要1KB的内存。
The sizeof(Bag)=32
。 (=短字符串的内部缓冲区为16字节+如果字符串大于16字节则加4字节指向内存+字符串的其他内容)。
保留200,000个元素后,矢量v
需要6400KB的内存。因此,直到现在的总内存是7400KB。
我不明白的是,在插入100,000个元素(小于预留容量v
)到v
后,内存使用量增加到14,800KB。如果我和int
替换string
这样的总使用存储器将是因为它应该是1,800KB(= 1000KB + 200 * 4B)
1. struct Bag
2. {
3. string s;
4. };
5. vector<Bag> v;
6. v.reserve(200000);
7. for(int i = 0; i < 100000; ++i)
8. {
9. v.push_back(Bag());
10. }
你是如何验证内存使用情况? – Chad
使用'任务管理器'。我知道这可能不是最准确的工具,但它在各种机器上显示非常确定性的内存行为(当然具有相同的架构)。 – theateist
您是否正在运行完全优化,因此不会生成不必要的副本?你可以尝试用一个'resize(100000)'替换'push_back()'调用吗? – Chad