当前位置: 首页 > news >正文

深入理解计算机系统记录

在 C 语言中,struct(结构体)和 union(联合体)都是用来存储多个不同类型的数据成员,但它们在内存分配和数据存储方式上有显著区别。下面详细说明它们的主要区别:


1. 内存分配

  • 结构体(struct):
    每个成员都占用独立的内存空间,结构体变量的总大小至少是所有成员大小的和(可能由于内存对齐规则会有额外的填充字节)。
    例如,定义如下结构体:

    struct MyStruct {
        int a;
        char b;
        float c;
    };
    

    如果 int 为 4 字节,char 为 1 字节,float 为 4 字节,加上可能的内存对齐,总大小通常为 12 字节或 16 字节。

  • 联合体(union):
    所有成员共用同一块内存,联合体变量的大小等于最大成员的大小。
    定义如下联合体:

    union MyUnion {
        int a;
        char b;
        float c;
    };
    

    如果 int 和 float 均为 4 字节,而 char 为 1 字节,则整个联合体大小为 4 字节。注意,同一时刻只能存储其中一个有效成员的值。


2. 数据存储和访问

  • 结构体(struct):
    每个成员都有自己独立的存储区域,可以同时存储和访问所有成员的数据。例如:

    struct MyStruct s;
    s.a = 10;
    s.b = 'A';
    s.c = 3.14f;
    

    这种方式适用于当你需要同时处理多个数据项时。

  • 联合体(union):
    因为所有成员共享同一块内存,所以在任一时刻只能保存一个成员的有效数据。修改一个成员会影响其他成员的值。例如:

    union MyUnion u;
    u.a = 10;
    // 如果此时读取 u.c,结果是不确定的,因为 u.a 和 u.c 共用内存
    

    联合体常用于节省内存,或者实现多种数据类型的解释(例如创建一个多用途的数据结构)。


3. 使用场景

  • 结构体(struct):

    • 当需要同时存储和访问多个彼此独立的数据项时使用。
    • 适用于描述复合数据(如定义一个学生、员工等信息结构)。
  • 联合体(union):

    • 当内存占用较为紧张,且某一时刻只需要一个数据成员的有效值时使用。
    • 常用于实现变长数据格式、多种数据类型的消息解析等场景。

4. 内存对齐和填充

  • 结构体(struct):
    由于每个成员有独立的内存空间,编译器可能会插入填充字节以满足内存对齐要求,从而提高访问效率。

  • 联合体(union):
    联合体的内存大小仅取决于最大成员的大小和对齐要求,因此不会有额外的填充问题。


总结

  • 内存分配:

    • Struct 为每个成员分配独立内存,总大小为各成员大小之和(加上对齐填充)。
    • Union 所有成员共享内存,总大小为最大成员大小。
  • 数据存储:

    • Struct 可以同时存储多个数据项;
    • Union 同一时刻只能存储一个数据项。

因此,根据你的具体需求选择使用结构体还是联合体。需要同时存储所有字段信息时使用结构体,需要节省内存或需要按照不同数据类型解释资源时使用联合体。

相关文章:

  • README.md 完全指南:Markdown 语法+实例
  • 消息中间件kafka,rabbitMQ
  • MQTT、HTTP短轮询、HTTP长轮询、WebSocket
  • OBOO鸥柏如何以智能教育室内外触摸屏一体机AI变革硬件
  • 在Spring Boot中浅尝内存泄漏
  • C++多态知识点梳理
  • Java笔记5——面向对象(下)
  • 如何在Windows 10系统中查看已连接WiFi密码-亲测可用-优雅草卓伊凡
  • 使WebSocket 稳定可靠,需要考虑的方向
  • 2025年十六届蓝桥杯Python B组原题及代码解析
  • 今日行情明日机会——20250414
  • css实现一键换肤
  • 入门-C编程基础部分:1、环境搭建
  • MySQL 超详细安装教程与常见问题解决方案
  • 优先级队列(堆二叉树)底层的实现:
  • 十四、C++速通秘籍—函数式编程
  • JAVA EE_文件操作和IO
  • 蓝桥杯 web 常考到的一些知识点
  • OpenCV 图形API(33)图像滤波-----高斯模糊函数gaussianBlur()
  • 3D版的VLA:从3D VLA、SpatialVLA到PointVLA——3D点云版的DexVLA,在动作专家中加入3D数据
  • 落实中美经贸高层会谈重要共识,中方调整对美加征关税措施
  • 牧原股份子公司与养殖户种猪买卖纠纷案一审胜诉
  • 超新星|罚丢点球的那道坎,刘诚宇靠自己迈了过去
  • 全球医药股普跌,A股创新药板块下挫
  • IPO周报|本周A股暂无新股网上申购,年内最低价股周二上市
  • 中美经贸高层会谈在瑞士日内瓦举行