1.10 C++踩坑排雷手册——union 的类型活跃状态:读取非活跃成员为未定义行为

1.10 C++踩坑排雷手册——union 的类型活跃状态:读取非活跃成员为未定义行为 1.10 C++实战100例——union的类型活跃状态:读取非活跃成员为未定义行为受众中级工程师,已掌握union的基本语法,能区分 C 风格 union 与 C++ 的活跃成员概念。默认具备基础 Linux 操作能力和 GDB 调试能力。场景锚定场景:你在 C++ 代码中定义了一个union包含int和float两个成员,先写入int再读取float,在 Debug 模式下得到合理结果(浮点数位模式解释),但在 Release 模式下程序输出异常值或触发编译器激进优化导致不可预测行为。你参考了 C 语言的惯用写法(类型双关通过 union 实现),但在 C++ 中却遇到了问题。这篇文章给你一条编译命令、一条 GDB 观察命令和一条 UBSan(未定义行为消毒器)检测命令,直接看穿编译器基于"活跃成员"假定的优化过程和 UB 触发机制。摘要C++ 标准规定:union中最多只有一个成员在任何时刻是"活跃"的(即最近一次被写入的成员)。读取非活跃成员的值是未定义行为,编译器有权基于"活跃成员不变"的假定做激进优化。这与 C 标准不同——C 语言允许通过 union 进行类型双关(type punning),而 C++ 不保证其安全性。UB 在实践中的表现包括:编译器