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&lt;T&gt; 在堆上分配动态内存。我也知道std::array&lt;T,N&gt; 在堆栈上分配内存。

但是当我将两个容器合并在一起时,内存是如何分配的呢?

喜欢 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&lt;T, N&gt;T 对象存储在对象本身中,就像它们是普通数据成员一样,而 std::vector&lt;T&gt; 在堆上分配一个缓冲区并构造 @ 987654324@ 内存中的对象

对于std::array&lt;T, N&gt;,由于T对象在std::array本身内部,这些T对象是分配在还是stack取决于std::array&lt;T, N&gt;的分配位置

如果std::array&lt;T, N&gt; 被分配在堆栈上,那么T 对象也会如此。

如果std::array&lt;T, N&gt; 分配在堆上(例如new std::array&lt;T, N&gt;),那么T 对象也是如此。


std::vector&lt;std::array&lt;T, N&gt;&gt;

向量将所有std::array&lt;T, N&gt; 对象存储在其内部缓冲区中,该缓冲区在堆上分配。也就是说,假设vec_of_arrs具有自动存储期限

std::vector<std::array<T, N>> vec_of_arrs;

只有对象vec_of_arrs 被分配到堆栈上。它的内部缓冲区——在其中创建了一个连续的std::array&lt;T, N&gt; 对象序列——在堆上分配。由于T 对象直接存储在std::array 中,因此它们也是在该内存(即堆)上构建的。


std::array&lt;std::vector&lt;T&gt;,N&gt;

std::array 将类型为 std::vector&lt;T&gt;N 对象直接存储为自身内部的数据成员。因此,如果包含std::array 的对象在堆栈上分配,则std::vector&lt;T&gt; 对象将在堆栈​​上。但是,每个向量的 内部缓冲区 是在堆上分配的,T 对象也是如此,因为它们是在该缓冲区上构造的。也就是说,假设arr_of_vecs具有自动存储期限

std::array<std::vector<T>,N> arr_of_vecs;

对象arr_of_vecs 在堆栈上分配。 std::vector&lt;T&gt; 对象在 std::array 对象中分配,因此它们也在堆栈上(即,std::array 包含 std::vector&lt;T&gt; 对象的连续序列)。但是,这些std::vector&lt;T&gt; 对象的内部缓冲区是在堆上分配的,而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

c++11 std::array vs 静态数组 vs std::vector

c++ 数组与 std::vector 和 std::array 的效率