c++ - vector 数组是完全连续的内存吗?

标签 c++ arrays memory

我知道 vector 保证是连续内存,数组也是。那么当我这样做时会发生什么:

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

内存会是什么样子?如果两者都需要连续,每次我在 my_array 上执行 push_back() 时,my_array[2] 之后数组的每个元素都会向前推一个字节吗[2]?

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

最佳答案

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

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

第一种数据会在一个数组中是连续的;第二种数据是动态分配的,所以它在数组中不会是连续的。

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

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

关于c++ - vector 数组是完全连续的内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25103800/

相关文章:

c++ - 具有固定步长的 ode 求解器

java - 为什么该方法会更改传递的数组的值

c++同时插入和排序 "empty"数组

ios - 更新 UITableView 使用的数据模型数组的正确方法

algorithm - O(1), O(n), O(n*n) 内存是什么意思?

c++ - Boost::Regex DOTALL 标志

c++ - C++中用户定义的行、列输出

c++ - 错误 LNK2019 : unresolved external symbol __imp__EnumDisplayDevicesA@16 referenced in function "private: struct _DISPLAY_DEVICEA __thiscall

memory - Aptana Studio 3 崩溃 - 新错误

python - 在 python 中 pickle 数据时出现 MemoryError