在 C++ 中,struct 和 union 有哪些主要区别?请说明 union 在内存使用和性能优化方面的典型应用场景及实现方式。
考察说明
考查对 C++ 结构体与联合体内存布局及用途差异的理解,并检验利用 union 进行内存优化的实际能力。
回答思路
- 【回答框架 1】struct 所有成员各自占用内存,总大小约等于各成员大小之和(考虑对齐),可同时保存全部成员值。union 所有成员共享同一块内存,大小等于最大成员的大小(考虑对齐),同一时刻只能有一个成员有效。
- 【回答框架 2】union 的优化价值在于节省内存:当多个字段不会同时使用时,用 union 可避免为每个字段单独分配空间。典型如协议解析中的类型联合体、事件消息的变体表示,或嵌入式系统中对寄存器位域的重解释。
- 【回答框架 3】使用 union 做优化时,通常配合判别字段(tag)标明当前活跃成员。例如在事件结构中定义事件类型枚举和 union 存储具体数据,从而减少结构体总字节数,提升缓存利用率和传输效率。
- 【回答框架 4】C++ 中 union 的成员若有非平凡构造、析构或拷贝函数时需特殊处理,可使用 union 包装类或 std::variant 作为现代替代。注意读写成员时需确保当前类型匹配,否则属于未定义行为。
- 【关键点 1】struct 成员独立占用内存,union 成员共享内存,union 大小由最大成员决定。
- 【关键点 2】union 常用于需要节省内存且各成员互斥的场景,例如协议头和事件变体。
- 【关键点 3】使用 union 时需用额外标记字段表明当前活跃成员,否则会引发未定义行为。
- 【易错点 1】误以为 union 能同时保存多个成员值,实际同一时刻仅一个成员有效。
- 【易错点 2】忽略对齐可能导致 union 实际大小大于最大成员大小,影响内存占用估算。
- 【易错点 3】在 C++ 中直接对含非平凡类型的 union 赋值拷贝可能产生未定义行为,未使用 std::variant 时应谨慎。