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

news2025/1/14 14:42:45

一、结构体的字节对齐与字节大小计算
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、结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节数”的整数倍(补齐)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Dify创建个问卷调查的工作流

为啥要使用Dify创建工作流呢?一个基于流程的智能体的实现,特别是基于业务的实现,使用Dify去实现时,通常都是一个对话工作流,当设计到相对复杂一些的流程时,如果将所有逻辑都放在对话工作流中去实现&#xf…

QT Quick QML 实例之椭圆投影,旋转

文章目录 一、前言二、演示三、部分代码与分析 QML 其它文章请点击这里: QT QUICK QML 学习笔记 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 一、前言 此 Demo 主要用于无人机吊舱视角的模拟&#xf…

高通,联发科(MTK)等手机平台调优汇总

一、常见手机型号介绍: ISP除了用在安防行业,还有手机市场,以及目前新型的A/VR眼睛,机器3D视觉机器人,医疗内窥镜这些行业。 下面是一些最近几年发布的,,,旗舰SOC型号: 1.联发科:天玑92…

AI的崛起:它将如何改变IT行业的职业景象?

随着人工智能(AI)的快速发展,许多人开始担忧其对IT行业的影响,担心AI的出现可能会导致大量IT从业者失业。然而,事实并非如此简单,AI的崛起将为IT行业带来深刻的变革,既有挑战,也有机…

【25考研】西南交通大学软件工程复试攻略!

一、复试内容 复试对考生的既往学业情况、外语听说交流能力、专业素质和科研创新能力,以及综合素质和一贯表现等进行全面考查,主要考核内容包括思想政治素质和道德品质、外语听说能力、专业素质和能力,综合素质及能力。考核由上机考试和面试两部分组成&a…

玩转大语言模型——langchain调用ollama视觉多模态语言模型

系列文章目录 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 langchain调用ollama视觉多模态语言模型 系列文章目录前言使用Ollama下载模型查找模型下载模型 测试模型ollama测试langchain测试加载图片加载模型…

Android Dex VMP 动态加载加密指令流

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 上一篇【详解如何自定义 Android Dex VMP 保护壳】实现了 VMP 保护壳。 为了进一步加强对 dex 指令的保护,实现指令流加密和动态加载,…

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

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

从零开始开发纯血鸿蒙应用之多签名证书管理

从零开始开发纯血鸿蒙应用 一、前言二、鸿蒙应用配置签名证书的方式1、自动获取签名证书2、手动配置签名证书 三、多签名证书配置和使用四、多证书使用 一、前言 由于手机操作系统,比电脑操作系统脆弱很多,同时,由于手机的便携性&#xff0c…

Windows Docker 安装

使用别人写好的软件/工具最大的障碍是什么——必然是配环境。配环境带来的折磨会极大地消解你对软件、编程本身的兴趣。虚拟机可以解决配环境的一部分问题,但它庞大笨重,且为了某个应用的环境配置好像也不值得模拟一个全新的操作系统。 Docker 的出现让…

LabVIEW运动控制(一):EtherCAT运动控制器的SCARA机械手应用

ZMC408CE 高性能总线型运动控制器 ZMC408CE是正运动推出的一款多轴高性能EtherCAT总线运动控制器,具有EtherCAT、EtherNET、RS232、CAN和U盘等通讯接口,ZMC系列运动控制器可应用于各种需要脱机或联机运行的场合。 ZMC408CE支持PLC、Basic、HMI组态三种…

【韩顺平Java笔记】第8章:面向对象编程(中级部分)【327-337】

327. 断点调试(Debug) 一个实际需求 在开发中,程序员在查找错误时,可用断点模式在断点调试过程中,是运行状态,是以对象的运行类型来执行的。 A extends B; B b new A(); b.xx();//按照运行类型来执行的 …

金融项目实战 01|功能测试分析与设计

前置内容:金融项目准备的内容笔记可直接看如下笔记 只看:一、投资专业术语 和 二、项目简介 两部分文章浏览阅读2.3k次,点赞70次,收藏67次。安享智慧理财金融系统测试项目,测试用例,接口测试,金…

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

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

ASP.NET Core - .NET 6 以上版本的入口文件

ASP.NET Core - .NET 6 以上版本的入口文件 自从.NET 6 开始,微软对应用的入口文件进行了调整,移除了 Main 方法和 Startup 文件,使用顶级语句的写法,将应用初始化的相关配置和操作全部集中在 Program.cs 文件中,如下&…

html5各行各业官网模板源码下载 (4)

文章目录 1.来源2.源码模板2.1 html实现酷炫美观的可视化大屏(十种风格示例,附源码)2.2 HTML5实现古典音乐网站源码模板22.3 HTML5实现古典音乐网站源码模板32.4 HTML5实现小鸟过管道小游戏源码2.5 HTML5实现俄罗斯方块小游戏2.5 HTML5实现剪刀石头布小游戏(附源码)…

springboot vue uniapp 仿小红书 1:1 还原 (含源码演示)

线上预览: 移动端 http://8.146.211.120:8081/ 管理端 http://8.146.211.120:8088/ 小红书凭借优秀的产品体验 和超高人气 目前成为笔记类产品佼佼者 此项目将详细介绍如何使用Vue.js和Spring Boot 集合uniapp 开发一个仿小红书应用,凭借uniapp 可以在h5 小程序 app…

播放音频文件同步音频文本

播放音频同步音频文本 对应单个文本高亮显示 使用audio音频文件对应音频文本资源 音频文本内容(Json) [{"end": 4875,"index": 0,"speaker": 0,"start": 30,"text": "70号二啊,","tex…

数据分析-使用Excel透视图/表分析禅道数据

背景 禅道,是目前国内用得比较多的研发项目管理系统,我们常常会用它进行需求管理,缺陷跟踪,甚至软件全流程的管理,如果能将平台上的数据结公司的实际情况进行合理的分析利用,相信会给我们的项目复盘总结带来…

No. 31 笔记 | Web安全-SQL手工注入技术学习 Part 2

一、研究背景 背景介绍 SQL注入是一种常见且高危的Web安全漏洞。攻击者可以通过构造恶意SQL查询语句来绕过验证机制,执行未授权操作,如获取敏感信息、篡改数据库内容甚至控制服务器。 研究内容 本笔记探讨以下数据库的手工注入技术: MySQLAc…