【问题标题】:How are arrays of type std::vector<std::array<T, N>> or std::array<std::vector<T>,N> stored in memory?std::vector<std::array<T, N>> 或 std::array<std::vector<T>,N> 类型的数组如何存储在内存中?
【发布时间】: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 的恢复对象序列/数组是完全存储在堆栈中还是其中的一部分在堆栈和堆之间共享?

非常感谢您的参与。

【问题讨论】:

    标签: c++ arrays memory stack heap-memory


    【解决方案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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-27
        • 1970-01-01
        • 2018-02-02
        • 2016-03-31
        相关资源
        最近更新 更多