C++学习笔记 34 union(联合体、共用体)

结构体(struct)

结构体允许你组合不同的数据类型在一个单一的复合类型中。每个成员变量在内存中占据独立的空间,结构体的大小是其所有成员变量所占空间之和。

优点

灵活性 可以定义不同类型的成员,满足复杂数据结构的需求。
清晰性 结构清晰,易于理解和维护。
常见问题与避免
内存对齐:编译器为了提高访问效率,会对结构体成员进行内存对齐,这可能导致结构体实际占用的内存大于各成员占用内存的总和。可以通过#pragma pack指令调整对齐规则,但需谨慎使用,以免影响性能。

代码示例

struct Person {
    char name[20];
    int age;
    double height;
};

int main() {
    Person p = {"Alice", 30, 1.75};
    cout << "Name: " << p.name << ", Age: " << p.age << ", Height: " << p.height << endl;
    return 0;
}

联合体(Union)

联合体的所有成员共享同一块内存区域,因此在任何时刻只能有效存储一个成员的值。改变其中一个成员的值会覆盖其他成员的值。

用途

节省内存:当需要在几种不同类型间切换使用同一块内存时。
类型转换:可以作为一种低级别的类型转换手段,但需谨慎使用。

易错点与避免

数据覆盖:由于成员共享内存,修改一个成员会影响其他成员的值。使用时务必清楚当前活跃的是哪个成员。
初始化问题:联合体通常只初始化第一个成员,对其他成员直接赋值可能会导致未定义行为。确保初始化并正确管理活跃成员。

union Data {
    int i;
    char c;
    double d;
};

int main() {
    Data data;
    data.i = 10;
    cout << "Integer value: " << data.i << endl;
    
    data.c = 'A';
    cout << "Char value: " << data.c << endl; // 注意此时data.i的值可能已不可预测
    
    return 0;
}

结构体与联合体的选择

当需要存储不同类型但同时有效的数据时,选择结构体。
当需要在同一内存位置存储不同类型的数据,且一次只使用一种类型时,考虑使用联合体。

小结

结构体和联合体都是C++中处理复杂数据结构的有效工具,但它们的设计哲学和适用场景大相径庭。理解它们的内存模型、特性以及潜在的陷阱,对于编写高效、可靠的代码至关重要。通过合理选择和使用这些复合数据类型,可以使我们的程序设计更加灵活和高效。

关联文章引用

C++一分钟之-结构体与联合体(Union)
C语言联合体union的用法
C/C++中的联合体union介绍

posted @ 2025-12-23 17:24  超轶绝尘  阅读(3)  评论(0)    收藏  举报