7

我正在考虑将std::queue(with std::deque) 用于 FIFO 结构。

在队列数据结构中,数据只在后面推,在前面弹出。因此,弹出一个元素后,前面的内存永远不会被使用。

shrink_to_fit我记得 std::vector 在我明确调用方法之前不会释放内存。怎么样std::deque

那么,我是否应该考虑释放前面永远不会再使用的内存呢?

4

2 回答 2

8

的内存分配特征std::deque是实现定义的。就s 而言,该标准对何时分配或释放内存没有具体要求。deque对插入、删除和访问性能的渐近要求强制实现某些方面。但其中可能有很多变化。

一般来说,如果你从 a 前面弹出足够多的东西,deque就会发生内存释放。

于 2013-08-26T09:21:48.547 回答
6

shrink_to_fit如果正常使用,您并不完全需要队列。std::vector'sshrink_to_fit适用于矢量内容大量减少的情况,因此调用(相当昂贵的)重新分配以释放大量内存实际上有好处。如果向量的生命周期很短或者它的大小变化不大,通常不需要它。

话虽如此,astd::deque是另一种野兽。它通常由固定大小的内存块组成。如果您从双端队列中删除大量元素,则不再包含任何元素的块可以/将被释放。因此,您在任何时候都可能拥有的最大内存开销略低于块大小的两倍,例如,如果队列仅包含两个元素,一个在块的末尾,第二个在下一个块的开头。因此,std::deque::shrink_to_fit只能以恰好释放一个块的方式移动双端队列的元素,这并不是一个很大的收获(iirc 的典型实现具有几 kb 的块大小)。

这些是非常笼统的陈述,可能不适用于内存紧急情况。但作为标准容器,vector 和 deque 都没有明确设计用于这种极端情况。如果内存占用是您使用队列的程序部分的问题,您可能希望使用另一种数据结构。

于 2013-08-26T09:26:50.833 回答