“对象矢量”与“对象指针矢量”的大小

时间:2011-09-06 02:35:40

标签: c++ pointers vector

我试图通过使用对象向量与指针向量来了解占用了多少内存。我写了一个小测试代码:

class Test {
public: 
   Test()
   { v.resize(2000); }

private:
    std::vector<int> v;
};

int main() 
{
   std::vector<Test> OCtr;
   std::vector<Test*> PCtr;
   Octr.resize(10);
   PCtr.resize(10, new Test);
   cout << OCtr.size()*sizeof(Test) << endl;
   cout << PCtr.size()*sizeof(Test*) << endl; 
}

输出是120和40.我可以理解40 - 因为它是10 * 4字节,但是惊讶于120.这是容器的实际大小 - OCtr?看起来sizeof(Test)不是获得完整大小对象的正确方法。

  • 不是在Test类中提供成员函数来总结所有Test数据成员的内存,而是有另一个获取任何类对象的大小。
  • 我已经阅读了何时使用对象向量与对象指针向量的答案。但是在我正在创建一个简单类的容器(没有多态行为)的情况下,内存消耗是主要标准,我可以处理对象指针的删除,我应该选择哪个容器?

4 个答案:

答案 0 :(得分:3)

如果采用矢量实例的大小,对于特定的系统实现,它将始终相同。在你的情况下,它是12个字节。向量使用默认或提供的分配器为其对象内容的实际存储分配内存。默认情况下,此内存来自堆,并且不会以向量对象本身的大小进行注册。

您可以通过获取矢量类型的大小并乘以元素数量,然后为适当的矢量添加12个字节来计算矢量及其数据使用的内存总量。

答案 1 :(得分:2)

sizeof是一个编译时运算符。也就是说,sizeof(X)将在编译期间用常数替换。这意味着sizeofvector<T>始终与sizeofvector<T>相同,其中包含数千个元素。请记住,sizeof在运行时没有做任何事情,因此结果不可能反映向量的当前状态。

答案 2 :(得分:1)

120个字节是每个对象12个字节,其中每个对象只存储一个向量,因此向量的大小和类的大小是相同的;如果我猜一下,我猜测大小的int,容量的int和另一个指向数据的指针,所有这些都加起来为12.这是可以理解的。

请记住,向量将其数据存储在堆中,因此它不是本地数据,因此不是vector返回的sizeof对象大小的一部分。仅计算指向该数据的指针的大小。所以你的v.resize(2000)对对象的大小没有任何作用,只对矢量正在使用的免费商店的内存块大小。

答案 3 :(得分:0)

你做错了什么。首先,OCtrPCtr都是相同的类型,它是Test的向量。不像你的一些代码所暗示的那样Test*

表达式PCtr.size()*sizeof(Test*)基本上没有意义,因为存储在PCtr中的东西不是指针而是整个对象。然而,你正在计算指针的大小(总是相同的)。

如果包含动态分配(如矢量那样),在C ++中我没有理解得到对象的总大小。换句话说,当你有一个容器的容器时,你正在通过.size()做多个sizeof(Test)正确的事情,但是当你试图创建一个指针容器时你需要更加小心。