std::vector<std::array<T, N>> 或 std::array<std::vector<T>,N> 类型的数组如何存储在内存中?
Posted
技术标签:
【中文标题】std::vector<std::array<T, N>> 或 std::array<std::vector<T>,N> 类型的数组如何存储在内存中?【英文标题】:How are arrays of type std::vector<std::array<T, N>> or std::array<std::vector<T>,N> stored in memory? 【发布时间】:2020-05-21 06:15:11 【问题描述】:我知道std::vector<T>
在堆上分配动态内存。我也知道std::array<T,N>
在堆栈上分配内存。
但是当我将两个容器合并在一起时,内存是如何分配的呢?
喜欢 f.e.:
std::vector<std::array<T, N>> a;
或
std::array<std::vector<T>,N> a;
作者:
std::vector<std::array<T, N>> a;
a
的恢复对象序列/数组是完全存储在堆上还是部分在堆和堆栈之间共享?
作者:
std::array<std::vector<T>,N> a;
a
的恢复对象序列/数组是完全存储在堆栈中还是其中的一部分在堆栈和堆之间共享?
非常感谢您的参与。
【问题讨论】:
【参考方案1】:基本上,std::array<T, N>
将 T
对象存储在对象本身中,就像它们是普通数据成员一样,而 std::vector<T>
在堆上分配一个缓冲区并构造 @ 987654324@ 内存中的对象。
对于std::array<T, N>
,由于T
对象在std::array
本身内部,这些T
对象是分配在堆还是stack取决于std::array<T, N>
的分配位置:
如果std::array<T, N>
被分配在堆栈上,那么T
对象也会如此。
如果std::array<T, N>
分配在堆上(例如new std::array<T, N>
),那么T
对象也是如此。
std::vector<std::array<T, N>>
向量将所有std::array<T, N>
对象存储在其内部缓冲区中,该缓冲区在堆上分配。也就是说,假设vec_of_arrs
具有自动存储期限:
std::vector<std::array<T, N>> vec_of_arrs;
只有对象vec_of_arrs
被分配到堆栈上。它的内部缓冲区——在其中创建了一个连续的std::array<T, N>
对象序列——在堆上分配。由于T
对象直接存储在std::array
中,因此它们也是在该内存(即堆)上构建的。
std::array<std::vector<T>,N>
std::array
将类型为 std::vector<T>
的 N
对象直接存储为自身内部的数据成员。因此,如果包含std::array
的对象在堆栈上分配,则std::vector<T>
对象将在堆栈上。但是,每个向量的 内部缓冲区 是在堆上分配的,T
对象也是如此,因为它们是在该缓冲区上构造的。也就是说,假设arr_of_vecs
具有自动存储期限:
std::array<std::vector<T>,N> arr_of_vecs;
对象arr_of_vecs
在堆栈上分配。 std::vector<T>
对象在 std::array
对象中分配,因此它们也在堆栈上(即,std::array
包含 std::vector<T>
对象的连续序列)。但是,这些std::vector<T>
对象的内部缓冲区是在堆上分配的,而T
对象是在该内存即堆上构造的。
【讨论】:
【参考方案2】:考虑以下代码:
struct S
int _i;
/* ... */
;
int main()
S s1;
S* s2 = new S;
return 0;
实例s1
在堆栈上,它的所有成员也是如此。 s2
指向的内容是在堆上分配的,它的所有成员也是如此。
现在,你的例子:
// all the instances of std::array<T, N> are on the heap,
// since std::vector allocates on the heap
std::vector<std::array<T, N>>
// the array itself is on the stack, and also the vector instances,
// but the content of the vectors is on the heap, as std::vector allocates on the heap
std::array<std::vector<T>,N>
【讨论】:
以上是关于std::vector<std::array<T, N>> 或 std::array<std::vector<T>,N> 类型的数组如何存储在内存中?的主要内容,如果未能解决你的问题,请参考以下文章
std::vector 的 std:array 的 SFINAE 不能在 C++11 中编译
为什么c ++用零来初始化std :: vector,而不是std :: array?
为啥 std::array<std::pair<int,int>, 3> 不能使用嵌套初始化列表初始化,但 std::vector<std::pair<int,in
来自指针的 std::array 或 std::vector