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