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

时间:2013-02-09 03:14:00

标签: c++ memory stl queue

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

1 个答案:

答案 0 :(得分:13)

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

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

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

  • std::deque介于两者之间,它是std::queue的默认容器。根据{{​​3}},MSVC双端队列是一个块列表,每个块包含大约16个字节,如果您的队列中包含一个或两个int并且您有很多队列,则会产生相当大的开销。

影响开销的另一个因素是平台上分配器的效率,除非您能够对结果进行说明,否则会对结果进行着色。两个实现之间的15倍差异是如此之大,以至于非常可疑 - 这让我想知道你是如何获得这些数字的。

一般来说,如果你的队列非常短,那么与其他实现相比还有很大的改进空间。如果您可以编写自己的容器,可以编写循环缓冲容器或使用"what the heck is going on with the memory overhead of std::deque"。对于deque类型的操作,循环缓冲区将std::vector的内存效率与std::deque的CPU效率相结合。有点让我希望它开始于STL。哦,好吧。

脚注

实际的开销数量会因实施而异。