EDITED
代码在VS2010中以Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
编译为32位,并在Win7 64位机器上运行。
使用空main
正文的程序占用1KB内存。
sizeof(Bag)=32
。 (=短字符串的内部缓冲区为16字节,如果添加大于16字节的字符串,则为指向内存的指针的4字节+字符串的其他内部内容)。
在保留200,000个元素后,向量v
占用6400KB的内存。因此,到目前为止总内存为7400KB。
我不明白为什么在将{100,000}元素(小于v
的保留容量)插入v
后,内存使用量增加到14,800KB。如果我将string
替换为int
,那么总使用内存将为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. }
答案 0 :(得分:2)
std::string
包含一个额外的已分配内存组件,用于包含字符串的内容;实际的字符串对象本身只是故事的一半。一些实现有一个优化来消除非常短的字符串的额外开销,但这不能保证。
每次分配使用的内存量取决于平台的最小分配特征。
答案 1 :(得分:0)
reserve()
函数为Bag对象包分配内存。这块内存包含std::string
的所有数据成员的空间。 std::string
分配用于保存字符串数据的内存,并指向它作为数据成员。 std::string
数据的内存块是您观察到的额外空间。
对于int
数据成员:它没有额外的缓冲区,因此没有分配额外的内存。
以下代码段显示字符串已分配额外字节:
#include <string>
#include <iostream>
int main() {
std::string s;
std::cout << "[1] Buf: " << s.capacity() << std::endl;
s = "Now it's contain some data";
std::cout << "[2] Buf: " << s.capacity() << std::endl;
return 0;
}
输出如下:
./a.out
[1] Buf: 22
[2] Buf: 47