"vector of objects"大小与"vector of Object pointers"

Size of "vector of objects" Versus "vector of Object pointers"

本文关键字:of vector Object pointers objects      更新时间:2023-10-16

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

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感到惊讶。这是集装箱的实际尺寸吗?看起来sizeof(Test)不是获得对象的完整大小的正确方法。

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

如果取vector实例的大小,对于特定的系统实现,它总是相同的。在您的例子中,它是12个字节。vector使用默认的或提供的分配器为其对象内容的实际存储分配内存。默认情况下,这些内存来自堆,不会在vector对象本身的大小中注册。

您可以通过取vector类型的size并乘以元素数量,然后为vector本身添加12个字节来计算vector及其数据所使用的总内存量。

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

120字节将是每个对象12字节,其中每个对象只是存储一个矢量,所以矢量的大小和类的大小是相同的;如果我猜的话,我猜大小是int,容量是int,还有一个指向数据的指针,加起来是12。这完全可以理解。

请记住,向量将它们的数据存储在堆中,所以它不是本地数据,因此不是sizeof返回的vector对象大小的一部分。只计算指向该数据的指针的大小。所以你的v.resize(2000)不会对对象的大小做任何事情,只会对向量使用的自由存储空间的内存块大小做任何事情。

你做错了一些事情。首先,OCtrPCtr都是同一类型,是Test的向量。不像你的一些代码所建议的Test*

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

我知道在c++中没有相同的方法来获得对象的总大小,如果它包含动态分配(如vector)。换句话说,当您拥有对象容器时,您正在对多个.size() by sizeof(Test)做正确的事情,但是当您尝试创建指针容器时,您需要更加小心。