gpt4 book ai didi

c++ - std::vector> 或 std::array,N> 类型的数组如何存储在内存中?

转载 作者:行者123 更新时间:2023-12-02 00:39:24 26 4
gpt4 key购买 nike

我知道std::vector<T>在堆上分配动态内存。我也知道std::array<T,N>在堆栈上分配内存。

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

例如:

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 的恢复对象序列/数组完全存储在堆栈中还是部分内容在堆栈和堆之间共享?

非常感谢您的参与。

最佳答案

基本上, std::array<T, N>存储 T对象本身内的对象 就像普通数据成员一样,而 std::vector<T>在堆上分配一个缓冲区并构造 T该内存上的对象

说到std::array<T, N> ,自 T对象位于 std::array 内本身,是否这些 T对象分配在堆栈上取决于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>>

vector 存储所有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存储N std::vector<T> 类型的对象直接作为其自身的数据成员。因此,std::vector<T>如果std::array,对象将在堆栈​​上包含它们的内容被分配在堆栈上。但是,每个 vector 的内部缓冲区都是在堆上分配的,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对象是在该内存(即堆)上构造的。

关于c++ - std::vector<std::array<T, N>> 或 std::array<std::vector<T>,N> 类型的数组如何存储在内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60073981/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com