【问题标题】:How is a STL map allocated? Stack or Heap?STL 映射是如何分配的?堆栈还是堆?
【发布时间】:2012-07-17 18:47:28
【问题描述】:

我想知道 C++ 中的 STL map 是否有连续的内存 - 还是分配给堆的内存?

【问题讨论】:

  • 这个问题与“对齐”有什么关系?
  • map 不能使用“堆栈”内存;这是不可能的。
  • @Mehrdad:我的自定义stack_allocator 想和你谈谈。 :P
  • @Xeo:我认为我们认为“堆栈”一词的含义不同。 :P 我说的是 CPU 堆栈,而不仅仅是看起来像堆栈的任何东西。但实际上,我一直在考虑制作一些以类似堆栈的方式分配的东西。当它们以类似堆栈的方式发生时,您的分配器的目的是提供有效的分配吗?如果是这样,你介意分享它吗? :D 编写分配器很痛苦...
  • 您是否有什么特别的原因。如果您解释一下您想知道的原因,也许我们可以提供更多帮助。

标签: c++ memory-management stl map


【解决方案1】:

由于map 是一个动态容器,其元素的内存是动态分配的(不管这意味着什么(它取决于可配置的分配器)!)。

此外,map 是一个基于节点的 容器,因此每个元素都进入不同的、单独的分配(以允许最大迭代器和引用非失效)。几乎可以肯定,元素在内存中是连续的,并且可能以反映您添加它们的方式分散在各处。

实际上,映射将被实现为某种类型的平衡树,以实现对数查找、插入和删除时间。

(如果您想要一个具有连续存储和对数查找时间的数据结构,请考虑使用排序向量。)

【讨论】:

  • 全部正确,当然除非您使用分配器来使项目在内存中连续,或者您非常幸运。 :)
  • @abarnert:它们可能很容易与将内存缓冲区作为输入进行分配的stack_allocator 连续,但它们在内存中可能不是按排序顺序排列的。
  • @Xeo:每个节点中可能存在一些节点开销,这意味着实际数据可能从不连续。
  • @Kerrek:没错,节点之间的链接用于迭代。
【解决方案2】:

它很可能是特定于实现的,并且 you can certainly change the allocator of any STL container,但这不适合胆小的人,您需要查看您正在使用的标准库的文档。

无论如何,map 通常实现为red-black tree,并且树节点位于堆上。

(如果我理解正确,树节点包含instances of value_type,它们是您的地图的键/值对)。

请注意,堆栈对于任何容器来说都是一个糟糕的存储想法,因为堆栈应该被视为稀缺资源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2019-10-25
    • 2012-11-23
    • 2015-07-21
    • 1970-01-01
    • 2021-05-18
    相关资源
    最近更新 更多