面试题:C++ 中 struct 和 union 的区别?如何使用 union 做优化?

在 C++ 中,structunion 都是用于定义复合数据类型的工具,但它们的用途和行为有显著区别。以下是它们的区别以及如何使用 union 进行优化。


1. structunion 的区别

特性structunion
内存分配每个成员有独立的内存空间所有成员共享同一块内存空间
内存大小大小为所有成员大小的总和(考虑对齐)大小为最大成员的大小
成员访问可以同时访问所有成员同一时间只能访问一个成员
用途用于组织多个相关的数据用于节省内存,同一时间只使用一个成员

2. struct 的用法

  • struct 用于将多个相关的数据成员组合在一起。
  • 每个成员有独立的内存空间,可以同时访问所有成员。
  • 例如:
  struct Point {
      int x;
      int y;
  };

  Point p;
  p.x = 10;
  p.y = 20; // x 和 y 可以同时使用

3. union 的用法

  • union 的所有成员共享同一块内存空间,同一时间只能使用其中一个成员。
  • 主要用于节省内存,适用于同一时间只使用一个成员的场景。
  • 例如:
  union Data {
      int i;
      float f;
      char c;
  };

  Data d;
  d.i = 10;       // 使用 int 成员
  std::cout << d.i; // 输出 10

  d.f = 3.14;      // 使用 float 成员
  std::cout << d.f; // 输出 3.14

4. 使用 union 进行优化

union 的主要优势是节省内存,适用于以下场景:

(1)存储多种类型的数据,但同一时间只使用一种

  • 例如,一个数据可能是 intfloatchar,但同一时间只会使用其中一种。
  • 使用 union 可以避免为每种类型分配独立的内存。
  • 例如:
  union Value {
      int intValue;
      float floatValue;
      char charValue;
  };

  Value v;
  v.intValue = 42; // 使用 int 成员
  v.floatValue = 3.14; // 切换到 float 成员

(2)struct 结合使用,实现变体类型

  • 可以将 unionstruct 结合,通过一个标记字段来指示当前使用的成员。
  • 例如:
  struct Variant {
      enum Type { INT, FLOAT, CHAR } type; // 标记字段
      union {
          int intValue;
          float floatValue;
          char charValue;
      };
  };

  Variant v;
  v.type = Variant::INT;
  v.intValue = 42; // 使用 int 成员

(3)节省内存,优化性能

  • 在内存受限的场景(如嵌入式系统)中,使用 union 可以减少内存占用。
  • 例如:
  union {
      uint32_t ipAddress; // 32 位 IP 地址
      uint8_t octets[4];  // 4 个 8 位字节
  } ip;

  ip.ipAddress = 0xC0A80101; // 设置 IP 地址
  std::cout << (int)ip.octets[0]; // 输出第一个字节:192

5. union 的注意事项

  • 成员覆盖:同一时间只能使用一个成员,访问其他成员会导致未定义行为。
  • 初始化:只能初始化第一个成员。
  • 析构函数:如果 union 的成员有非平凡析构函数,需要手动管理内存。

6. C++ 中的匿名 union

  • 匿名 union 可以直接访问其成员,无需通过 union 变量名。
  • 例如:
  struct Widget {
      enum Type { INT, FLOAT } type;
      union {
          int intValue;
          float floatValue;
      };
  };

  Widget w;
  w.type = Widget::INT;
  w.intValue = 42; // 直接访问 intValue

总结

  • struct:用于组织多个相关的数据成员,每个成员有独立的内存空间。
  • union:用于节省内存,所有成员共享同一块内存空间,同一时间只能使用一个成员。
  • 优化场景union 适用于内存受限的场景,或者需要存储多种类型但同一时间只使用一种的场景。

在现代 C++ 中,union 的使用较少,但在特定场景(如嵌入式开发或高性能计算)中仍然有其价值。

THE END
点赞14 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容