【问题标题】:std::vector and std::list memory layoutstd::vector 和 std::list 内存布局
【发布时间】:2013-08-03 02:11:20
【问题描述】:

我们知道std::vector给出的是连续的内存布局,而std::list给出的是链接的内存布局,我的问题是std::vector<:list>的内存布局是什么?它是包含 std::list 的内容还是只包含几个指向列表的指针?

【问题讨论】:

  • 它与任何其他std::vector&lt;T&gt; 相同(除非T=bool):它包含T 的数组。在这种情况下,它是一个std::list 的数组。
  • @nneonneo:几乎闻起来像 OP 想知道如果列表本身是向量的元素,向量是否会包含列表的元素。
  • 好吧,在那种情况下,答案显然是否定的。 std::vector 不在乎 T 是什么,只要它是可复制的。 (原则上,您可以设计一个专门用于承载其他容器的容器......)
  • @nneonneo:没错。你应该把这两个 cmets 作为答案。
  • @VladLazarenko:完成。

标签: c++ list memory vector stl


【解决方案1】:

虽然std::list 确实将其元素保存在单独分配的内存位置中,并且作为链表相互连接,但链表本身的标题结构需要一小块内存。当您创建std::list&lt;T&gt; 的实例时,会分配此结构。

std::list&lt;T&gt; 的向量由各个链表的这些“标题”项组成,分配在连续的内存区域中:

【讨论】:

    【解决方案2】:

    它与任何其他std::vector&lt;T&gt; 相同(除非T=bool):它包含T 的数组。在这种情况下,它是std::list 的数组。 std::list 对象基本上是它“包含”的对象列表的簿记结构;实际元素位于此结构之外的单独分配的块中(因此在std::vector&lt;std::list&lt;T&gt; &gt; 管理的内存块之外)。

    请注意,std::vector 并不关心 T 是什么,只要它是可复制的。原则上,您可以设计一个专门用于承载其他容器的容器,但这不是std::vector 的工作原理。

    【讨论】:

      猜你喜欢
      • 2019-03-03
      • 2017-03-21
      • 2011-01-19
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 2017-03-22
      • 2012-05-07
      相关资源
      最近更新 更多