You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么gcc下sizeof(std::stack<int>)的测量值远高于预期?

为什么GCC下std::stack<int>和std::set<int>的sizeof超出预期

std::stack<int>大小为80字节的原因

你对std::stack的实现逻辑存在认知偏差:

  • std::stack本身不是独立实现的容器,而是容器适配器,它只封装栈操作的接口,所有元素存储、状态维护的逻辑完全交给内部持有的底层容器实例实现。
  • GCC标准库中std::stack默认的底层容器是std::deque<int>,因此sizeof(std::stack<int>)的数值完全等于sizeof(std::deque<int>)。

64位环境下GCC的std::deque为了实现双向O(1)插入删除、随机访问的特性,内部需要维护以下成员:

  • 指向中控指针数组(存储所有数据块地址)的指针
  • 中控数组的总容量
  • 第一个数据块的起始迭代器
  • 最后一个数据块的结束迭代器
  • 分配器实例、块偏移维护相关的辅助成员
    这些成员累加后的总大小刚好为80字节,和你的测试结果一致。

你可以自行替换底层容器验证结论:测试sizeof(std::stack<int, std::vector<int>>),得到的结果就是std::vector的大小(通常为24字节,对应3个指针的总大小),完全符合你对栈结构的大小预期。

std::set<int>大小为48字节的原因

GCC的std::set底层基于红黑树实现,为了保证操作效率,需要维护的结构远不止根节点指针:

  • 红黑树根节点指针
  • 最左子节点指针(用于O(1)返回首迭代器)
  • 哨兵节点指针(用于O(1)返回尾后迭代器)
  • 整棵树的节点计数(用于O(1)返回size()结果)
  • 分配器实例、红黑树颜色管理的辅助成员
    64位环境下这些成员累加的总大小为48字节,和你的测试结果吻合。

内容的提问来源于stack exchange,提问作者Victor Telnov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:06:03