Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 3d stl矢量内存大小问题 std::vectorsp(1,std::vector(1,std::vector(1));_C++ - Fatal编程技术网

C++ 3d stl矢量内存大小问题 std::vectorsp(1,std::vector(1,std::vector(1));

C++ 3d stl矢量内存大小问题 std::vectorsp(1,std::vector(1,std::vector(1));,c++,C++,该3d矢量的内存分配应该是什么? Masf显示了84个字节,但是它不应该接近int(4字节)的大小吗?< p>当你使用STL时,你必须考虑到你的数据结构不仅由数据本身组成,而且由元数据组成。它们是对象而不是内存区域 对于每个向量对象,都有几个属性。看看: 通过手工计算,似乎每个向量在开始时包含7个元素。因此7*sizeof(int)*3=84为什么它应该接近4字节?vector是一个不仅仅具有元素属性的类!如果内存不足,您可能不应该使用std::vector,而应该使用一个数组或您自己实现的更接

该3d矢量的内存分配应该是什么?
Masf显示了84个字节,但是它不应该接近int(4字节)的大小吗?

< p>当你使用STL时,你必须考虑到你的数据结构不仅由数据本身组成,而且由元数据组成。它们是对象而不是内存区域

对于每个向量对象,都有几个属性。看看:


通过手工计算,似乎每个向量在开始时包含7个元素。因此
7*sizeof(int)*3=84

为什么它应该接近4字节?vector是一个不仅仅具有元素属性的类!如果内存不足,您可能不应该使用std::vector,而应该使用一个数组或您自己实现的更接近标准数组大小的ArrayList

通常使用3个指针实现单个
std::vector

  • 指向所分配区域开头的指针
  • 指向有效数据结尾的指针
  • 指向已分配区域(保留空间)末尾的指针
因此,在64位平台上,除了实际内容之外,它至少还有3x8=24字节


因此,如果整数为4个字节,则具有一个整数的3d向量将至少占用24x3+sizeof(int)=76个字节。对于8字节,整数将是80字节,不包括堆分配器所需的任何额外对齐。

感谢您的解释,这似乎是一种开销。所以如果我做std::vector>sp(1,std::vector(1,std::vector(2));这应该只占用一个额外的整数,对吗?但是它又用了12个字节,现在是96个字节,如果我把它改成3加上12个字节108。这是为什么?
std::vector
通常分配的内存块大于它立即需要的内存块。这是为了避免在增长过程中出现过多的重新分配。查看
std::vector::capacity
std::vector::size
之间的差异。感谢您的输入,但这是我做的第一件事,容量是1、1和2,与预期的一样
 std::vector< std::vector< std::vector<int> > > sp(1, std::vector< std::vector<int> >(1,std::vector<int>(1)));