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



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

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

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

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

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

另一个影响开销的因素是平台上分配器的效率,除非你能解释,否则它会给你的结果带来色彩。两个实现之间的15倍差异太大了,这简直令人怀疑——这让我想知道你是如何得到这些数字的。

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

脚注

实际的管理费用将随着实施的不同而变化。

最新更新