我偶然发现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矢量使用的内存比线性内存更多,我发现在这个例子中显着更多(约4Gb)。
答案 0 :(得分:3)
在前一种情况下,你有:
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
sizeof(vector<T>)
T
的典型值为3 * sizeof(T*)
,我相信标准容量所允许的最小值也必须与大小不同,因为reserve()
1}}必须更改capacity()
的值,而不是size()
的值。
答案 1 :(得分:2)
向量类使用内存来保存其他指针。当您分配为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亿字节。
答案 2 :(得分:0)
vector类有一些额外的开销。至少有一个指针和一个大小的字段。在MS visual studio中,sizeof(std :: vector)是20或24(启用了迭代器调试)。实际大小将取决于实现。
答案 3 :(得分:0)
每个矢量对象都有一个开销 - 因为它们可以是可变长度,因此需要指向开始,使用位的大小及其容量的指针。
如果您有一个固定尺寸的3d形状,其高度,宽度和长度已知,您可以将其转换为一维数组。这将是最有效的。
为了给出x,y,z,你会发现索引为x + width *((z * height)+ y)将进行转换。