【问题标题】:C++ STL queue memory usage compared to vector?与向量相比,C++ STL 队列内存使用情况?
【发布时间】:2013-02-09 03:13:59
【问题描述】:

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

【问题讨论】:

  • std::queue 只是一个容器适配器,它封装了对底层序列类的功能公开,包括std::liststd::vectorstd::deque 等序列,后者是默认值。在不知道您使用的是哪个底层容器的情况下,很难说。使用std::list 会显着增加每个元素的开销,因为每个元素都会被赋予两个额外的成员数据(前后指针)。但最终,它是依赖于实现的。现在,在您的情况下,数量级有所不同,这有点可疑。
  • 我有queue<int> stuff[100000]

标签: c++ memory stl queue


【解决方案1】:

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

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

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

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

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

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

脚注

实际开销会因实施而异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-30
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多