std::vector<std::vector<T>>与std::array嵌套结构的内存布局连续性疑问
C++ 二维容器内存布局相关问题解答
1. std::vector<std::vector>的内存布局特性
- 单个内层
std::vector<T>的元素仍严格符合连续存储的要求,这是C++标准对std::vector的强制约束,和外层容器类型无关。 - 所有内层vector的整体数据并不处于同一块连续内存中:外层
std::vector自身存储的是连续排列的内层std::vector对象,每个内层vector本质是持有独立堆内存的句柄(通常内部只存几个指针/大小、容量参数),各自的元素数据是单独申请的堆内存块,互相之间没有地址连续的约束。
2. 调整内层vector大小的开销问题
不存在需要拷贝移动大量对象维持整体连续的情况:
- 调整单个内层vector的大小时,仅会操作该内层vector自身持有的堆内存,扩容时也仅拷贝当前这个内层vector的自有元素,完全不会影响其他内层vector的内存布局,更不存在「维持整体内存连续」的设计要求,毕竟这类嵌套vector的元素整体本身就不是连续存储的。
3. std::array<std::array<T,N>,N>的内存连续性
- 是的,它和原生二维数组
T[N][N]一样具备整体内存连续的特性。std::array是C++标准规定的聚合类型,无额外管理开销,底层直接封装原生数组。外层std::array存储的是N个连续排布的内层std::array<T,N>对象,每个内层std::array的元素直接内嵌在自身的对象内存中,没有额外的独立堆内存申请,因此整体所有元素按行优先顺序连续存储在同一块内存上,和原生二维数组的内存布局完全等价。
内容的提问来源于stack exchange,提问作者Urwald
相关产品推荐
相关产品推荐

