一组向量是完全连续的内存吗?

时间:2014-08-03 10:31:36

标签: c++ arrays memory

我知道向量保证是连续的内存,数组也是如此。那么当我做这样的事情时会发生什么:

std::vector<uint8_t> my_array[10];
my_array[2].push_back(11);
my_array[2].push_back(7);

记忆是什么样的?如果两者都需要连续,那么每次my_array[2] push_back()my_array[2]时,{{1}}之后的数组的每个元素都会向前推送一个字节吗?

这是否与我有一个结构数组时的情况相同,其中结构体的成员具有可变大小,例如字符串或其他向量?

2 个答案:

答案 0 :(得分:6)

std::vector的内存占用由两部分组成:

  • std::vector对象本身的内存(非常小,与大小无关),
  • 向量数据的存储器(取决于向量中的元素数量)。

第一种数据在数组中是连续的;第二种数据是动态分配的,因此在数组中不会是连续的。

这与具有灵活数据成员的C struct不同,因为std::vector的数据部分并不总是分配在同一类型的内存中,更不用说是相邻的它。矢量本身可以分配在静态,动态或自动存储区域中,而其数据总是在动态区域中。此外,当调整矢量大小时,其数据的存储器可能会移动到不同的区域。

每次调用push_back时,std::vector都会检查是否有足够的动态内存来容纳下一个数据元素。如果内存不足,则向量会分配更大的内存块,并在推送新项目之前将其当前内容移动到那里。

答案 1 :(得分:3)

向量存储器结构在存储器中是连续的;但是std :: vector&#39;都包含一个指针,指向实际存储的动态分配内存(很可能不是连续的)。

知道了这一点,std :: vector :: push_back只会检查(外部)动态分配的数组是否有足够的容量来容纳新项,否则会重新分配空间。第一个向量溢出的push_back不会导致数组中的第二个向量重新分配内存,这不是它的工作原理。

此外,没有结构具有可变大小,结构和类的大小必须在编译时知道。

std :: string也有一个固定的大小,虽然你可能认为它是可变的,因为它(如vector)也有一个指向它所包含的char*的指针。