6

我想知道与向量相比,队列使用了多少内存。前几天我遇到了一个问题,我有一个使用大约 60MB 的 int 队列数组,而当将相同的数据放入一个使用大约 4MB 的向量向量中时。这是我在编写程序时的错误还是 stl 队列通常比向量使用更多的内存?

4

1 回答 1

16

std::queue是一个容器适配器,而不是容器本身。所以让我们比较一些实际容器的开销:

  • std::vector非常节省内存,它使用几乎零开销。在大多数平台上, Astd::vector<int>每个项目使用大约 4 个字节。

  • std::list内存效率非常低,它可能会使用每个项目的两个开销指针。Astd::list<int>在 64 位平台上每个项目使用大约 24 个字节,在 32 位平台上使用 12 个字节。

  • std::deque介于两者之间,是std::queue. 根据“内存开销到底是怎么回事std::dequeint ,MSVC deque 是一个块列表,每个块包含大约 16 个字节,如果您的队列每个包含一个或两个并且您有很多,这是相当多的开销的队列。

影响开销的另一个因素是您平台上分配器的效率,除非您可以考虑到它,否则它将为您的结果着色。两个实现之间 15 倍的差异是如此之大,以至于完全令人怀疑——这让我想知道你是如何得到这些数字的。

一般来说,如果您的队列很短,那么与其他实现相比还有很大的改进空间。如果您可以编写自己的容器,您可以编写一个循环缓冲区容器或使用Boost 的circular_buffer. 循环缓冲区结合了双端队列类型操作的内存效率std::vector和 CPU 效率std::deque。有点让我希望它一开始就在 STL 中。那好吧。

脚注

实际开销将随实施而变化。

于 2013-02-09T03:30:47.180 回答