std::optional 内存布局
对于std::optional<int>
对应的内存布局为
struct optional_mem { int _M_payload; bool _M_engaged; };
可以通过godbolt通过pahole工具查看
在汇编窗口选择 pahole右侧会显示数据结构
class exception_ptr { void * _M_exception_object; /* 0 8 */ public: /* size: 8, cachelines: 1, members: 1 */ /* last cacheline: 8 bytes */ }; struct nullopt_t { /* size: 1, cachelines: 0, members: 0 */ /* padding: 1 */ /* last cacheline: 1 bytes */ }; class optional<int> : _Optional_base<int, true, true>, _Enable_copy_move<true, true, true, true, std::optional<int> > { /* struct _Optional_base<int, true, true> <ancestor>; */ /* 0 8 */ /* XXX 65528 bytes hole, try to pack */ /* struct _Enable_copy_move<true, true, true, true, std::optional<int> > <ancestor>; */ /* 0 0 */ /* XXX last struct has 1 byte of padding */ public: /* size: 8, cachelines: 1, members: 2 */ /* padding: 8 */ /* paddings: 1, sum paddings: 1 */ /* last cacheline: 8 bytes */ /* BRAIN FART ALERT! 8 bytes != 0 (member bytes) + 0 (member bits) + 65528 (byte holes) + 0 (bit holes), diff = -524224 bits */ }; class _Optional_base_impl<int, std::_Optional_base<int, true, true> > { protected: /* size: 1, cachelines: 0, members: 0 */ /* padding: 1 */ /* last cacheline: 1 bytes */ }; struct _Empty_byte { /* size: 1, cachelines: 0, members: 0 */ /* padding: 1 */ /* last cacheline: 1 bytes */ }; union _Storage<int, true> { struct _Empty_byte _M_empty; /* 0 0 */ int _M_value; /* 0 4 */ }; struct _Optional_payload_base<int> { union _Storage<int, true> _M_payload; /* 0 4 */ bool _M_engaged; /* 4 1 */ /* size: 8, cachelines: 1, members: 2 */ /* padding: 3 */ /* last cacheline: 8 bytes */ }; struct _Optional_payload<int, true, true, true> : _Optional_payload_base<int> { /* struct _Optional_payload_base<int> <ancestor>; */ /* 0 8 */ /* XXX last struct has 3 bytes of padding */ /* size: 8, cachelines: 1, members: 1 */ /* paddings: 1, sum paddings: 3 */ /* last cacheline: 8 bytes */ /* BRAIN FART ALERT! 8 bytes != 0 (member bytes) + 0 (member bits) + 0 (byte holes) + 0 (bit holes), diff = 64 bits */ }; struct _Optional_base<int, true, true> : _Optional_base_impl<int, std::_Optional_base<int, true, true> > { /* class _Optional_base_impl<int, std::_Optional_base<int, true, true> > <ancestor>; */ /* 0 0 */ /* XXX last struct has 1 byte of padding */ struct _Optional_payload<int, true, true, true> _M_payload; /* 0 8 */ /* size: 8, cachelines: 1, members: 2 */ /* paddings: 1, sum paddings: 1 */ /* last cacheline: 8 bytes */ }; struct _Enable_copy_move<true, true, true, true, std::optional<int> > { /* size: 1, cachelines: 0, members: 0 */ /* padding: 1 */ /* last cacheline: 1 bytes */ }; class bad_optional_access : public exception { public: /* class exception <ancestor>; */ /* 0 0 */ /* size: 8, cachelines: 1, members: 1 */ /* padding: 8 */ /* last cacheline: 8 bytes */ };
可以看到最终数据存储在
struct _Optional_payload_base<int> { union _Storage<int, true> _M_payload; /* 0 4 */ bool _M_engaged; /* 4 1 */ /* size: 8, cachelines: 1, members: 2 */ /* padding: 3 */ /* last cacheline: 8 bytes */ };
中,_M_payload
中存储实际数据
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)