【发布时间】:2011-03-17 06:50:31
【问题描述】:
在实现stack、queues、linked list 等基本数据结构时。
我应该通过动态分配内存来创建资源池(节点)还是应该在每次需要节点时单独分配内存?
【问题讨论】:
标签: pool dynamic-memory-allocation
在实现stack、queues、linked list 等基本数据结构时。
我应该通过动态分配内存来创建资源池(节点)还是应该在每次需要节点时单独分配内存?
【问题讨论】:
标签: pool dynamic-memory-allocation
这是时间与空间的基本权衡。根据对您更重要的内容进行选择:
如果您提前分配池,那么您的运行时元素插入平均会针对速度进行优化,即恒定时间,即 O(1)。 “平均”意味着大多数插入将是恒定时间,除了那些达到最大值并需要扩展池的插入是线性时间,O(n)。如果您最终没有使用整个池,也可能会浪费一些内存。
如果您对每个新节点进行实时分配,您将始终有固定时间插入,但在这种情况下,固定时间稍长比上面的常数时间,因为你不仅需要将一个值放入一个内存位置,而且你还必须首先分配内存位置。此外,这种方法通过提前保留内存位置,不会浪费任何内存。
在大多数情况下,我认为实时分配在时间方面足够有效,我不明白您为什么要使用池化方法,除非您的应用程序需要极高的平均速度或者你做了大量的插入。
【讨论】:
这完全取决于您的目标。默认情况下(即除非您确实需要这样做),只需为每个下一个节点进行正常分配。
与仅分配节点相比的内存池:
加快分配速度。根据底层分配机制,有时明显更快。
通常内存碎片较少,但对于某些分配器来说这可能不是问题。
主要缺点:在保留但未使用的节点上浪费内存。如果您不加选择地使用数据结构(例如 1000 个实例)而不是仅使用几个实例,这一点非常重要。
由于这个缺点,内存池不适合一般情况。
在 C++ 中,所有标准容器都有一个 allocator 模板参数。
【讨论】: