【问题标题】:Resource pool for a data structure数据结构的资源池
【发布时间】:2011-03-17 06:50:31
【问题描述】:

在实现stackqueueslinked list 等基本数据结构时。 我应该通过动态分配内存来创建资源池(节点)还是应该在每次需要节点时单独分配内存?

【问题讨论】:

    标签: pool dynamic-memory-allocation


    【解决方案1】:

    这是时间与空间的基本权衡。根据对您更重要的内容进行选择:

    如果您提前分配池,那么您的运行时元素插入平均会针对速度进行优化,即恒定时间,即 O(1)。 “平均”意味着大多数插入将是恒定时间,除了那些达到最大值并需要扩展池的插入是线性时间,O(n)。如果您最终没有使用整个池,也可能会浪费一些内存。

    如果您对每个新节点进行实时分配,您将始终有固定时间插入,但在这种情况下,固定时间稍长比上面的常数时间,因为你不仅需要将一个值放入一个内存位置,而且你还必须首先分配内存位置。此外,这种方法通过提前保留内存位置,不会浪费任何内存。

    在大多数情况下,我认为实时分配在时间方面足够有效,我不明白您为什么要使用池化方法,除非您的应用程序需要极高的平均速度或者你做了大量的插入。

    【讨论】:

    • 忘了说:使用池化方法的另一个原因是如果出于某种原因您需要连续的内存位置,即像Java的ArrayList实现一样。但这不在您在示例中列出的数据结构中。
    【解决方案2】:

    这完全取决于您的目标。默认情况下(即除非您确实需要这样做),只需为每个下一个节点进行正常分配。

    与仅分配节点相比的内存池:

    • 加快分配速度。根据底层分配机制,有时明显更快。

    • 通常内存碎片较少,但对于某些分配器来说这可能不是问题。

    • 主要缺点:在保留但未使用的节点上浪费内存。如果您不加选择地使用数据结构(例如 1000 个实例)而不是仅使用几个实例,这一点非常重要。

    由于这个缺点,内存池不适合一般情况。

    在 C++ 中,所有标准容器都有一个 allocator 模板参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      • 2021-09-21
      相关资源
      最近更新 更多