【C语言 结构体联合体】字节对齐与字节大小计算

一、结构体的字节对齐与字节大小计算
1.1 结构体字节对齐的规则
1.2 示例解释
1.3 结论

二、联合体的字节对齐与字节大小计算
2.1联合体的对齐规则:
2.2 示例解释
2.2.1 实例1
2.2.2实例2
2.3 总结

三、结构体对齐基本规则

✨注意✨:先进行字节对齐,然后进行所占字节大小的计算。

一、结构体的字节对齐与字节大小计算

结构体字节对齐,以最长的那个为标准?

不是总是以最长的成员为标准,而是根据编译器的默认规则和对齐原则。以下是具体规则:


1.1 结构体字节对齐的规则
  1. 成员的对齐
    每个成员按照其类型大小对齐,例如:
    • char 对齐到 1 字节边界。
    • short 对齐到 2 字节边界。
    • intfloat 对齐到 4 字节边界。
    • double 对齐到 8 字节边界。
  2. 整体的对齐
    结构体的总大小必须是其最长对齐成员大小的倍数(或编译器指定的对齐参数)。
  3. 填充字节
    为了满足上述对齐规则,编译器会在必要时插入填充字节。
如果这没看懂,移步第三部分。

1.2 示例解释
typedef struct 
{
    short a;  // 2 字节
    char b;   // 1 字节
    int c;    // 4 字节
} Example;
  • 对齐分析
    • a 对齐到 2 字节边界,占 2 字节。s
    • b 紧接 a,但 char 对齐到 1 字节,仍占用 1 字节,编译器插入 1 字节填充
    • c 对齐到 4 字节边界,占 4 字节。
  • 总大小
    • 成员占用:2 + 1 + 1(填充) + 4 = 8 字节。
    • 总大小满足 4 字节对齐,所以结果为 8 字节

1.3 结论

字节对齐通常与最长的成员大小相关,但并非总是直接等于它,还取决于成员的顺序和编译器的设置。

二、联合体的字节对齐与字节大小计算

联合体(union)的字节对齐规则与结构体类似,但稍有不同,关键点如下:


2.1 联合体的对齐规则:
  1. 所有成员共享同一块内存
    联合体的大小由最大成员的大小决定,因为所有成员都存储在同一块内存中。
  2. 对齐按最大成员的对齐要求
    联合体的对齐方式是其最大成员的对齐要求(字节边界)。编译器会根据这个要求插入填充字节,使联合体的大小满足对齐要求。
  3. 总大小是最大对齐单位的倍数
    为了确保对齐,联合体的总大小会向上取整,成为最大对齐单位的倍数。

2.2 示例解释
2.2.1 实例1
typedef union {
    char a;       // 1 字节
    int b;        // 4 字节
    double c;     // 8 字节
} ExampleUnion;
  • 对齐分析:
    • 成员 a 需要 1 字节对齐,占 1 字节。
    • 成员 b 需要 4 字节对齐,占 4 字节。
    • 成员 c 需要 8 字节对齐,占 8 字节。
  • 联合体大小:
    • 最大成员 c 占用 8 字节,且对齐要求为 8 字节。
    • 联合体的大小为 8 字节(无额外填充,因为已经满足 8 字节对齐)。

2.2.2 实例2

再看一个复杂点的例子:

typedef union {
    short a;       // 2 字节
    char b[3];     // 3 字节
    int c;         // 4 字节
} ExampleUnion2;
  • 对齐分析
    • 成员 a 需要 2 字节对齐,占 2 字节。
    • 成员 b[3] 需要 1 字节对齐,占 3 字节。
    • 成员 c 需要 4 字节对齐,占 4 字节。
  • 联合体大小
    • 最大成员是 c,占 4 字节,对齐要求为 4 字节。
    • 联合体的大小为 4 字节(不需要额外填充)。

2.3 总结

对于联合体:

  • 大小 = 最大成员的大小(加上必要的填充以满足对齐)。
  • 对齐单位 = 最大成员的对齐要求。

三、结构体对齐基本规则

https://blog.csdn.net/qq_44443986/article/details/110082316

基本规则

规则1数据成员对齐规则

  • 结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存放在offset为该数据成员大小的整数倍的地方。所以存在当前填充,确保下一位没错位。

  • 比如int在32位机为4字节,则要从4的整数倍地址开始存储。

规则2结构体大小规则

  • 结构体的总大小必须是其内部最大成员大小的整数倍。如果不是,编译器会在结构体末尾添加填充字节(padding)以满足这一规则

  • 结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

规则3嵌套结构体对齐规则

  • 如果一个结构体B里嵌套另一个结构体A,则结构体A应从offset为A内部最大成员的整数倍的地方开始存储。

  • struct B里存有struct A,A里有char,int,double等成员,那A应该从8的整数倍开始存储。结构体A中的成员的对齐规则仍满足原则1、原则2。
    不是直接将结构体A的成员直接移动到结构体B中;

·
·
由于存储变量地址对齐的问题,计算结构体大小的3条规则:

1、结构体变量的首地址,必须是结构体变量中的“最大基本数据类型成员所占字节数”的整数倍。(对齐)
2、结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本数据类型所占字节的整数倍。(对齐)
3、结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节数”的整数倍(补齐)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/953394.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浅谈云计算08 | 基本云架构

浅谈基本云架构 一、负载分布架构二、资源池架构三、动态可扩展架构四、弹性资源容量架构五、服务负载均衡架构六、云爆发架构七、弹性磁盘供给架构八、冗余存储架构 在当今数字化时代,云计算已成为企业发展的核心驱动力,而其背后的一系列关键架构则是支…

【专题】2025年节日营销趋势洞察报告汇总PDF洞察(附原数据表)

原文链接: https://tecdat.cn/?p38813 在当今复杂多变且竞争激烈的消费市场环境下,节日营销已成为企业获取市场份额、提升品牌影响力的关键战略时机。我们深知深入洞察节日营销趋势对于企业决策的重要性。 本报告汇总基于对 2024 年多个关键消费节点及…

【Linux系统】权限位(mode bits)

这张图是使用结构体 struct stat 中的 st_mode 字段时画的,获取表示文件的类型和权限,它是典型的 POSIX 系统调用(如 stat() 和 fstat())返回的 struct stat 结构的一部分,用于描述文件的元数据。 在 Linux 和 Unix 系…

无源器件-电容

电容器件的参数 基本概念由中学大学物理或电路分析内容获得,此处不做过多分析。 电容的产量占全球电子元器件产品的40%以上。 单位:法拉 F;1F10^6uF;电路中常见的104电容就是10*10^4pF100nF0.1uF C为电容,Rp为绝缘电…

Go语言之路————go环境的初始化

Go语言之路————go环境的初始化 前言一、Go的安装二、环境配置三、初始化一个新项目四、常用的一些指令 前言 我是一名多年Java开发人员,因为工作需要现在要学习go语言,Go语言之路是一个系列,记录着我从0开始接触Go,到后面能正…

数据结构与算法之链表: LeetCode 234. 回文链表 (Ts版)

回文链表 https://leetcode.cn/problems/palindrome-linked-list/description/ 描述 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表如果是,返回 true ;否则,返回 false 示例 1 输入:head [1,2,2,1]…

Hive4.0.1集群安装部署(Hadoop版本为3.3.6)(详细教程)

前置环境 ​​​Linux环境Zookeeper集群安装(详细教程)-CSDN博客 Hadoop HA高可用集群3.3.6搭建(详细教程)-CSDN博客 MySQL8.0.40离线安装(详细教程)_mysql 8.0.40 ftp-CSDN博客 Hadoop3.3.6官网下载链接地…

Windows安装ES单机版设置密码

下载ES ES下载链接 我用的是7.17.26 启动前配置 解压之后打开D:\software\elasticsearch-7.17.26\bin\elasticsearch-env.bat 在elasticsearch-env.bat文件中修改jdk的路径 修改前 修改内容 if defined ES_JAVA_HOME (set JAVA"D:\software\elasticsearch-7.17.26\…

Wireshark抓包教程(2024最新版个人笔记)

改内容是个人的学习笔记 Wireshark抓包教程(2024最新版)_哔哩哔哩_bilibili 该课程笔记1-16 wireshark基础 什么是抓包工具:用来抓取数据包的一个软件 wireshark的功能:用来网络故障排查;用来学习网络技术 wireshark下…

云平台一键部署【Video-Background-Removal】视频换背景,无任何限制,随意换

Video-Background-Removal 是一款革命性的视频背景替换工具,旨在让用户轻松实现视频背景的快速更换。无论你是专业创作者还是普通用户,这款软件都能让你在几秒钟内改变背景,完全消除限制,随心所欲,随时随地想换就换&am…

2025年,华为认证HCIA、HCIP、HCIE 该如何选择?

眼看都到 2025 年啦,华为认证还吃香不? 把这问题摆在每个网络工程师跟前,答案可没那么容易说清楚。 到底考不考它值当不值当,重点在于您自己的职业规划,还有对行业走向的领会。 2025 年华为认证仍然值得一考&#…

使用 Docker 部署 Java 项目(通俗易懂)

目录 1、下载与配置 Docker 1.1 docker下载(这里使用的是Ubuntu,Centos命令可能有不同) 1.2 配置 Docker 代理对象 2、打包当前 Java 项目 3、进行编写 DockerFile,并将对应文件传输到 Linux 中 3.1 编写 dockerfile 文件 …

学习threejs,使用TrackballControls相机控制器

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.TrackballControls 相…

C# OpenCV机器视觉:转速测量

在一个看似平常却又暗藏神秘能量的日子里,阿杰正在他那充满科技感的实验室里,对着一堆奇奇怪怪的仪器发呆。突然,手机铃声如一道凌厉的剑气划破寂静,原来是工厂的赵厂长打来的紧急电话:“阿杰啊,咱们工厂新…

机器视觉4-损失函数与梯度计算

机器视觉4-损失函数与梯度计算 损失函数定义公式及变量含义整体理解 多类支撑向量机损失正则项与超参数什么是超参数一、与模型参数的区别二、常见的超参数三、调参方法 什么是优化一、参数优化的重要性二、利用损失函数进行反馈三、调整分类器参数的方法 优化的目标一、最小化…

网络安全-RSA非对称加密算法、数字签名

数字签名非常普遍: 了解数字签名前先了解一下SHA-1摘要,RSA非对称加密算法。然后再了解数字签名。 SHA-1 SHA-1(secure hash Algorithm )是一种 数据加密算法。该算法的思想是接收一段明文,然后以一种不可逆的方式将…

Lianwei 安全周报|2025.1.13

新的一周又开始了,以下是本周「Lianwei周报」,我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件,保证大家不错过本周的每一个重点! 政策/标准/指南最新动态 01 美国国土安全部发布《公共部门生成式人工智能部署手…

LabVIEW部署Web服务

目录 LabVIEW部署Web服务1、创建项目2、创建Web服务3、新建WebVI3.1、使用GET方法3.2、使用POST方法 4、 部署和对应URL4.1、应用程序:80804.2、本地调试:80094.3、NI Web服务器:9090(禁用) 5、测试5.1、测试GET方法5.2、测试POST方法 6、实际…

初阶数据结构【栈及其接口的实现】

目录 前言一、栈的概念及结构二、栈的实现方式三、栈的实现3.1 基本结构3.2 栈的基本功能接口栈的初始化栈的销毁 3.3 入栈接口3.4 出栈接口3.5 栈的其它接口获取数据的个数接口栈判断是否为空接口获取栈顶数据接口 注:为什么要实现这些简单的接口,直接调…

基于Java+SpringBoot+Vue的前后端分离的体质测试数据分析及可视化设计

基于JavaSpringBootVue的前后端分离的体质测试数据分析及可视化设计 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码…