【问题标题】:Why is sizeof(std::stack<int>) so large?为什么 sizeof(std::stack<int>) 这么大?
【发布时间】:2021-12-13 10:14:08
【问题描述】:

在 gcc 中,我测量了 sizeof(std::stack&lt;int&gt;),它显示了 80 个字节。为什么这么大?

它可以包含指向顶部的指针和大小。即使它还包含指向分配器的指针,也不能超过 20 个字节。

另一个例子,sizeof(std::set&lt;int&gt;) 是 48 个字节。

【问题讨论】:

  • 是的,这两个容器看起来确实有点胖(粗略一瞥)。是的,您几乎必须成为成员的大小是正确的 - 因为要求 C++11 中的大小需要为 O(1)。您的实现作为数据成员有什么?
  • stack 只是容器适配器。默认情况下,std::deque 存储在适配器内部。通过指针和大小变量来实现双端队列是相当困难的。
  • 默认情况下(可以更改)std::stack 包含一个 std::deque,其中包含不连续的元素、对某些操作的复杂性等的要求等。这组属性需要将以std::deque 的大小表示的簿记元素的数量(例如,至少一对迭代器、单独存储大小等)。

标签: c++ gcc


【解决方案1】:

你知道你可以自己阅读the source,对吧?

class stack 有一个single member,一个_Sequencestd::deque&lt;_Tp&gt; 的类型别名(而_Tpint)。

转到implementation of std::deque:这只是_Deque_base 周围的wrapper,这是wrapper 周围_Deque_impl反过来持有_Deque_impl_data,最后我们到达the following

struct _Deque_impl_data {
    _Map_pointer _M_map;
    size_t _M_map_size;
    iterator _M_start;
    iterator _M_finish;
...
};

其中iterator_Deque_iteratorfollowing members

struct _Deque_iterator {
...
      _Elt_pointer _M_cur;
      _Elt_pointer _M_first;
      _Elt_pointer _M_last;
      _Map_pointer _M_node;
...
}

总结一下:每个迭代器保存 4 个指针(在 64 位系统中 = 32 个字节),然后_Deque_impl_data 保存另外两个指针,总共 80 个字节。

【讨论】:

  • 但是为什么要使用 std::deque(双端队列)来实现呢?它不需要这样的功能。它不包含迭代器,只能从顶部插入或删除。
  • 有一个 SO question 关于那个
  • 不,这不能回答我的问题。我的问题是,为什么它使用双端队列,而不是单端队列/列表/或类似的东西并且没有任何迭代器项?它过多,现在它的权重为 80 个字节。这种普通堆栈的实现非常简单。从非常重要的标准堆栈中,我需要包含额外的非标准库。
猜你喜欢
  • 2013-09-24
  • 2012-06-14
  • 2011-03-07
  • 2014-08-19
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多