为什么将空结构插入保留向量会增加内存?

时间:2014-01-14 04:54:50

标签: c++ string memory

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.   }

2 个答案:

答案 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