C++面试题更新 2026-08-03

在 C++ 中,struct 和 union 有哪些主要区别?请说明 union 在内存使用和性能优化方面的典型应用场景及实现方式。

考察说明

考查对 C++ 结构体与联合体内存布局及用途差异的理解,并检验利用 union 进行内存优化的实际能力。

回答思路

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