我应该缩小std :: queue以适应?

时间:2013-08-26 08:51:47

标签: c++ c++11

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

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

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

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

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:5)

如果队列正常使用,您并不需要shrink_to_fitstd::vector的{​​{1}}适用于矢量内容已大量减少的情况,因此它实际上有利于调用(相当昂贵的)重新分配以释放大量的记忆。如果载体寿命短或者其大小变化不大,通常不需要它。

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

这些是非常笼统的陈述,可能不适用于记忆危急情况。但是作为标准容器,传感器而非deque都没有明确地设计用于这种极端情况。如果在使用队列的程序部分中存在内存占用问题,则可能需要使用另一个数据结构。