我试图通过使用对象向量与指针向量来了解占用了多少内存。我写了一个小测试代码:
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)不是获得完整大小对象的正确方法。
答案 0 :(得分:3)
如果采用矢量实例的大小,对于特定的系统实现,它将始终相同。在你的情况下,它是12个字节。向量使用默认或提供的分配器为其对象内容的实际存储分配内存。默认情况下,此内存来自堆,并且不会以向量对象本身的大小进行注册。
您可以通过获取矢量类型的大小并乘以元素数量,然后为适当的矢量添加12个字节来计算矢量及其数据使用的内存总量。
答案 1 :(得分:2)
sizeof
是一个编译时运算符。也就是说,sizeof(X)
将在编译期间用常数替换。这意味着sizeof
空vector<T>
始终与sizeof
和vector<T>
相同,其中包含数千个元素。请记住,sizeof
在运行时没有做任何事情,因此结果不可能反映向量的当前状态。
答案 2 :(得分:1)
120个字节是每个对象12个字节,其中每个对象只存储一个向量,因此向量的大小和类的大小是相同的;如果我猜一下,我猜测大小的int,容量的int和另一个指向数据的指针,所有这些都加起来为12.这是可以理解的。
请记住,向量将其数据存储在堆中,因此它不是本地数据,因此不是vector
返回的sizeof
对象大小的一部分。仅计算指向该数据的指针的大小。所以你的v.resize(2000)
对对象的大小没有任何作用,只对矢量正在使用的免费商店的内存块大小。
答案 3 :(得分:0)
你做错了什么。首先,OCtr
和PCtr
都是相同的类型,它是Test
的向量。不像你的一些代码所暗示的那样Test*
。
表达式PCtr.size()*sizeof(Test*)
基本上没有意义,因为存储在PCtr中的东西不是指针而是整个对象。然而,你正在计算指针的大小(总是相同的)。
如果包含动态分配(如矢量那样),在C ++中我没有理解得到对象的总大小。换句话说,当你有一个容器的容器时,你正在通过.size()
做多个sizeof(Test)
正确的事情,但是当你试图创建一个指针容器时你需要更加小心。