繁体   English   中英

为什么C ++中的3D向量在RAM中比1D向量大

[英]Why are 3D vectors in C++ larger in RAM than a 1D vector

我偶然发现STL向量定义如下:

vector < float > test;
test.resize(10000 * 10000 * 5);

在RAM中占用的空间比以下定义少得多:

std::vector<std::vector<std::vector< float > > > test;

test.resize(10000);
for(int i = 0;i <  10000;i++)
{
test[i].resize(10000);
for(int j = 0;j <  10000;j++)
{
test[i][j].resize(5);
}
}

线性矢量方法(前一个)使用正确的RAM量(2Gb),如手动计算。 所以我的问题是,为什么3D矢量消耗的RAM比线性的更多,我发现它在这个例子中显着更多(约4Gb)。

在前一种情况下,您有:

sizeof(vector<float>)                  // outermost vector
  + 10000 * 10000 * 5 * sizeof(float)  // xyz space

在后者你有:

sizeof(vector<vector<vector<float>>>)      // outermost vector
  + 10000 * sizeof(vector<vector<float>>)  // x axis
  + 10000 * 10000 * sizeof(vector<float>)  // xy plane
  + 10000 * 10000 * 5 * sizeof<float>      // xyz space

任何T sizeof(vector<T>)的典型值是3 * sizeof(T*) ,我相信,标准容量允许的最小值必须与大小不同,因为reserve()必须改变capacity()的值,但不是size()

向量类使用内存来保存其他指针。 当您分配为1D向量时,您只有1指针和指向的大内存块。 在向量的向量向量的情况下,你有10,000 * 10,000 * 5个向量,每个向量有一个4字节指针,占用20亿个额外字节,只是为了保持位置信息。

编辑

正如安德烈在评论中指出的那样,你实际上并没有设置10,000 * 10,000 * 5个向量,而是:

1D - 顶层向量为其下方的10,000个向量留出空间

2D - 这10,000个向量中的每一个都设置另外10,0000个向量

3D - 最终级别只是实际数据所以......

你有10,000个初始载体,下面有10,000 * 10,000个载体,总共有100,010,000个载体。 另一个用户提到了每个向量占用的大约20个字节的空间(对于内存指针以及类中的其他成员,如大小,容量等等),因此最终会产生大约20亿个字节。

向量类有一些额外的开销。 至少有一个指针和一个大小的字段。 在MS visual studio中,sizeof(std :: vector)是20或24(启用了迭代器调试)。 实际大小将取决于实现。

每个向量对象都有一个开销 - 因为它们可以是可变长度,因此需要指向开始,使用位的大小及其容量的指针。

如果您有一个固定尺寸的3d形状,其高度,宽度和长度已知,您可以将其转换为一维数组。 这将是最有效的。

为了给出x,y,z,你会发现索引为x + width *((z * height)+ y)将进行转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM