C++ STL队列与向量的内存使用情况相比如何?

7

我在想,相比于向量,队列使用了多少更多的内存。前几天我遇到了一个问题,我有一个包含整数队列的数组,使用了大约60MB的内存,但是当相同的数据被放入一个向量的向量中时,它只使用了大约4MB。这是我的编程错误还是STL队列通常会比向量使用更多的内存?


2
一个std::queue只是一个容器适配器,它包装了对底层序列类的功能暴露,包括诸如std::liststd::vectorstd::deque等序列,后者是默认的。如果不知道使用哪个底层容器,很难说。使用std::list会增加显著的每个元素开销,因为每个元素都会被赋予两个额外的成员数据(前向指针和后向指针)。然而,最终还是取决于实现。现在,在你的情况下相差一个数量级,这有点可疑。 - WhozCraig
我有一个 queue<int> stuff[100000] - William Rookwood
1个回答

16

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

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

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

  • std::deque介于两者之间,并且是std::queue的默认容器。 根据"what the heck is going on with the memory overhead of std::deque",MSVC deque是一系列包含大约16字节的块的列表,如果您的队列每个包含一个或两个int,并且您有很多队列,则开销相当大。

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

一般来说,如果您的队列非常短,则相比其他实现方法有很大的改进空间。 如果您愿意编写自己的容器,可以编写一个循环缓冲容器或使用Boost 的circular_buffer。 循环缓冲将std::vector的内存效率与std::deque的CPU效率结合起来,用于deque类型操作。 有点让我希望它最初就是在STL中的。 唉。

注脚

实际开销金额因实现方式而异。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接