C++ “的大小”;“物体的矢量”;对;“对象指针向量”;

C++ “的大小”;“物体的矢量”;对;“对象指针向量”;,c++,pointers,vector,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.re

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

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; 
}
类测试{
公众:
测试()
{v.resize(2000);}
私人:
std::向量v;
};
int main()
{
std::向量OCtr;
std::载体PCtr;
八次调整大小(10);
PCtr.调整大小(10,新测试);

cout120字节将是每个对象12字节,其中每个对象只存储一个向量,因此向量的大小和类的大小是相同的;如果我猜一猜,我会猜一个int表示大小,int表示容量,以及另一个指向数据的指针,加起来是12。这是可以理解的


请记住,向量将其数据存储在堆中,因此它不是本地数据,因此不是由
sizeof
返回的
vector
对象大小的一部分。只计算指向该数据的指针的大小。因此,
v.resize(2000)
对对象的大小没有任何影响,只对向量使用的空闲存储上的内存块大小有影响。

120字节将是每个对象的12字节,其中每个对象只存储一个向量,因此向量的大小和类的大小是相同的;如果我猜一猜,我会猜一个int表示大小,int表示大小容量和另一个指向数据的指针加起来总共是12。这是可以理解的


请记住,向量将其数据存储在堆中,因此它不是本地数据,因此不是由
sizeof
返回的
vector
对象大小的一部分。只计算指向该数据的指针的大小。因此,
v.resize(2000)
对对象的大小没有任何影响,只对向量所使用的空闲存储上的内存块的大小有影响。

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


您可以计算向量及其数据使用的内存总量,方法是:取向量类型的大小,乘以元素数,然后为向量本身添加12个字节。

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


您可以计算向量及其数据使用的内存总量,方法是取向量类型的大小,乘以元素数,然后为向量本身添加12个字节。

您做错了一些事情。首先,
OCtr
PCtr
都是相同的类型,即
Test
的向量>.不是您的一些代码所建议的
Test*

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


在C++中,如果包含动态分配(如vector),则没有一个明智的方法来获得对象的总大小。换句话说,您正在对多个<代码>做正确的操作。
当你有一个对象容器时,但是当你试图制作一个指针容器时,你需要更加小心。

你做了一些错误的事情。首先,
OCtr
PCtr
都是相同的类型,这是
Test
的向量。而不是你的一些代码所建议的
Test*

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


在C++中,如果包含动态分配(如vector),则没有一个明智的方法来获得对象的总大小。换句话说,您正在对多个<代码>做正确的操作。当您有一个对象容器时,但在尝试创建指针容器时需要更加小心。

sizeof
是一个编译时运算符。也就是说,
sizeof(X)
将在编译期间替换为常量。这意味着
sizeof
一个空的
vector
始终与
sizeof
一个
vector
相同,其中包含数千个元素。请记住,
sizeof
在运行时不起任何作用,因此结果不可能反映出来t向量的当前状态。

sizeof
是一个编译时运算符。也就是说,
sizeof(X)
将在编译期间替换为常量。这意味着
sizeof
一个空的
vector
始终与
sizeof
一个
vector
相同,其中包含数千个元素。请记住,
sizeof
在运行时不起任何作用,因此结果不可能反映出来t向量的当前状态。

OCtr和PCtr将Test作为参数。感谢指向,jagan..完成编辑ctr和PCtr将Test作为参数。感谢指向,jagan..完成编辑。但是在测试对象创建过程中,我创建了一个2000个元素的整数向量,这意味着每个测试对象至少应为8000字节。为什么测试对象大小只有12个字节??thanks@cppcoder更新了我的答案。这是因为向量只存储一个指向2000个元素的指针