我在想,相比于向量,队列使用了多少更多的内存。前几天我遇到了一个问题,我有一个包含整数队列的数组,使用了大约60MB的内存,但是当相同的数据被放入一个向量的向量中时,它只使用了大约4MB。这是我的编程错误还是STL队列通常会比向量使用更多的内存?
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中的。 唉。
实际开销金额因实现方式而异。
std::queue
只是一个容器适配器,它包装了对底层序列类的功能暴露,包括诸如std::list
、std::vector
和std::deque
等序列,后者是默认的。如果不知道使用哪个底层容器,很难说。使用std::list
会增加显著的每个元素开销,因为每个元素都会被赋予两个额外的成员数据(前向指针和后向指针)。然而,最终还是取决于实现。现在,在你的情况下相差一个数量级,这有点可疑。 - WhozCraigqueue<int> stuff[100000]
。 - William Rookwood