理解C ++中向量实例占用的空间

时间:2010-12-12 12:43:31

标签: c++ std

我正在尝试了解std :: vector实例占用的字节数。以下代码:

    vector <int>uno;
    uno.push_back(1);
    uno.push_back(1);
    cout <<"1: "<< sizeof(uno)<<" bytes"<<endl;
    cout << endl;

    vector <bool>unos;
    unos.push_back(true);
    cout <<"2: "<< sizeof(unos)<<" bytes"<<endl;
    cout << endl;

给了我这个输出:

1:12字节

2:20字节

有人可以解释为什么vector<bool>的大小比vector<int>的字节多吗?什么是测量矢量实例的字节大小的正确方法...通过添加矢量中每个成员的大小?

2 个答案:

答案 0 :(得分:4)

在C ++中,sizeof运算符始终在编译时进行评估,因此每个vector<T>都具有相同的大小(除非vector<T>是专门化的vector<bool>)。

如果您想知道12个字节,那可能是3个指针的大小,或者是指针的大小,元素数量和容量。真实数据永远不会存储在vector

如果你想知道总共使用了多少内存,一个很好的近似值是:

sizeof(std::vector<T>) + my_vector.capacity() * sizeof(T)

这只是一个近似值,因为它没有考虑堆上的簿记数据。

答案 1 :(得分:3)

std::vector<bool>更大,因为它比std::vector<int>更复杂。当前的C ++标准指定vector<bool>数据应该是位打包的。这需要一些额外的簿记,并且与正常的std::vector<T>相比,它们的行为略有不同。

即将推出的C ++ 0x标准很可能会删除std::vector<bool>的这种不同行为。