C语言-结构体对齐

news2025/7/27 21:18:37

详细说明参考博客

(1条消息) C语言结构体对齐,超详细,超易懂_haozigegie的博客-CSDN博客

(1条消息) #pragma pack详解_OuJiang2021的博客-CSDN博客_#pragma pack

以下个人理解总结

出现结构体对齐考虑的根本原因就是:【数据存取执行效率】和【存储空间】的博弈。

1、结构体对齐编译修饰

#pragma pack()    恢复默认对齐方式

#pragma pack(n )   n -1,2,4,8 对齐方式选择 ,n=1表示地址连续分配,无对齐

#pragma pack(show) 显示当前字节对齐方式的字节数,以warning显示。keil-STM32环境pack默认是8.

  • n = 8 表示 1、2、4、8字节的数据都能够一次性快速读写。一般默认是8字节对齐。  
  • n = 4 表示 1、2、4字节数据都能一次性读写。8字节数据可能需要分成两次才能完成一次读写。
  • n = 2 表示 1、2 字节的变量可以一次性读写,4字节变量可能会被分成两次才能读写。8字节可能会更多次。
  • n = 1 为最紧密的存储方式。没有浪费多余的空闲地址。一般在数据打包解析数据流时用到。
#pragma pack(1)
typedef struct
{
	uint8_t a;
	uint16_t b;
	uint32_t c;
}type1;
typedef struct
{
	uint32_t c;
	uint16_t b;
	uint8_t a;
}type2;
 type1 t1;
int  test()
{
	t1.a =0xFF;
	t1.b = 0xFFFF;
	t1.c = 0xFFFFFFFF;
	type2 t2;
	int size = sizeof(t1);
	int size2 = sizeof(t2);
	return size ;
}

 此处存放未对齐32位数据用了 

        STR      r2,[r3,#0x03] 

那就是一条就赋值过去了,CotexM3有这个能力额,和开始想的两次写入有点出入。其他平台可就没这么厉害了,比如51单片机就不可以。

2、结构体大小

上文提到结构体对齐是为了快速访问存储器。

虽然在STM32上测试不对奇也有汇编指令STR快速操作存储器。这里有硬件支持不做特殊说明。但是不影响咱们去理解和接受其原理。

 说明:默认状态下,pack = 8

规则1整个结构体的大小等于其成员单个最大变量大小的整数倍数。比如结构体中变量最大2字节,那么最终结构体大小也是2的倍数。如果最大变量时4,则结构体大小就是4的倍数,以此类推。该特性用于占位结构体末尾未对齐的空间

规则2、结构体成员变量每个变量都会找到自己的位置,它自身大小时固定的,唯独它自省和前面变量空留的空间时不定的。主要满足自身大小和地址成整数倍关系就能被快速读写。uint8_类型那所有地址都是整数倍,uin16_t 那就是2的倍数地址。uint32_t  就是4的倍数地址。以此类推。


举例

typedef struct
{
	uint8_t a;
	uint16_t b;
	uint32_t c;
}type1;

typedef struct
{
	uint32_t a;
	uint16_t b;
	uint8_t  c;
}type2; 

根据规则1,type1和type2中最大的变量时4字节,所以type1,type2大小就是4的倍数,并且分配时4字节对齐。

type1.a起始地址就是4字节对齐的。 假设为type1.a地址为0x00。正常下一个地址是0x01.但是type1.b是2字节宽的数据。所以不能放在0x01地址,空一格位置。type1.b地址定位0x02.占用2字节。当前地址为0x04,刚好是4的倍数,可以做为type1.c的首地址。

type2中的a,b,c变量按照规则2都在连续的空间上,但是按照规则1,type2大小必须是4的倍数,所以type2.c之后预留了一个空的位置。

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

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

相关文章

玫瑰花变蚊子血,自动化无痕浏览器对比测试,新贵PlayWright Vs 老牌Selenium,基于Python3.10

也许每一个男子全都有过这样的两个女人,至少两个。娶了红玫瑰,久而久之,红的变了墙上的一抹蚊子血,白的还是床前明月光;娶了白玫瑰,白的便是衣服上沾的一粒饭黏子,红的却是心口上一颗朱砂痣。–…

网络原理 2

文章目录1. 网络层2. 数据链路层3. DNS前言 : 上文已经 将 网络层 和 传输层 说完了, 下面我们来学习以下 网络层 和 数据链路层 里 相关的知识 , 关于 网络层 和 数据链路层 的知识 简单了解一下即可 . 1. 网络层 网络层 主要 做两件事 : 1.地址管理…

如何优雅的用golang封装配置项(Functional Options)

导读 最近要封装一个公共服务,涉及到配置项的地方总是找不到合理的方案,后来看了一下grpc在配置方面的封装,了解到原来是golang特有的Functional Options编程模式,今天分享给大家,希望你能用到,咱们直接来看…

Linux 文件权限之umask

目录一、文件默认创建权限二、文件默认创建权限掩码三、文件权限的修改本文主要讲解Linux中的文件默认创建权限相关的内容,涉及到的内容有:文件默认创建权限、文件默认创建权限掩码、文件访问权限的修改。 文件访问者共三类:文件所有者、文件…

忆享聚焦|人工智能、元宇宙、云计算、5G基站…近期热点资讯一览

“忆享聚焦”栏目第十二期来啦!本栏目汇集近期互联网最新资讯,聚焦前沿科技,关注行业发展动态,筛选高质量讯息,拓宽用户视野,让您以最低的时间成本获取最有价值的行业资讯。目录行业资讯1.ChatGPT火爆全球 …

值传递和引用传递

什么叫 值传递&引用传递值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。引用传递:引用传递是指在调用函数时将实际参数的地址传递到函数中,…

2023不伤人脉的全新商城分销,一劳永逸的消费分红

2023不伤人脉的全新商城分销,一劳永逸的消费分红 2023-02-24 11:52梦龙 2023不伤人脉的全新商城分销,一劳永逸的消费分红 如今是流量为王的时代,但是如何将流量转化为忠实客户是个难题。不再是单向的买卖关系,而是从对产品的关注…

CSS 盒子模型【快速掌握知识点】

目录 一、什么是盒子模型 二、边框border-color 三、边框粗细border-width 四、边框样式border-style 五、外边距margin 六、内边距padding 七、圆角边框 八、圆形 九、盒子阴影 一、什么是盒子模型 css盒子模型又称为框模型,盒子的最内部是元素的实际内容…

国家调控油价预测案例+源码

项目git地址:https://github.com/Boris-2021/Oil-price-control-forecast 使用已知的历史数据:日期、汇率、布伦特、WTI、阿曼原油价格,预测下一个调价周期中的汽油、柴油零售限价的调价价格。 一. 需求 1.1 需求说明 使用已知的历史数据&a…

Linux:makefile小结

1.初学者要掌握的基本知识 一条规则: 两个函数 三个变量 2.自己写的makefile,说明每条命令的作用: #指定源文件为*.c src $(wildcard *.c) #通过src生成中间需要的汇编文件名,把src中.c替换为.o obj $(patsubst %.c, %.o, $(src)) #…

编译原理【文法设计】—每个a后面至少一个b、ab个数相等,ab个数不相等的所有串

编译原理【文法设计】—设计每个a后面至少一个b、ab个数相等,ab个数不相等的文法为字母表Σ{a,b}Σ\{a,b\}Σ{a,b}上的下列每个语言设计一个文法 (a) 每个a后面至少有一个b的所有串 首先,每个a后面至少有一个b的正规式怎么写呢?每个a都需要…

华为OD机试题,用 Java 解【快递运输】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

16、变量、流程控制与游标

文章目录1 变量1.1 系统变量1.1.1 系统变量分类1.1.2 查看系统变量1.2 用户变量1.2.1 用户变量分类1.2.2 会话用户变量1.2.3 局部变量1.2.4 对比会话用户变量与局部变量2 定义条件与处理程序2.1 案例分析2.2 定义条件2.3 定义处理程序2.4 案例解决3 流程控制3.1 分支结构之 IF3…

MSTP的负载均衡实验

MSTP的负载均衡实验 拓扑图 配置思路 网路互联,交换机和网线配置网络设备 交换机 1. 初始化配置 2. 创建vlan 3. 交换机连接PC 设置模式为access, 并将端口加入对应vlan 交换机连接交换机端口 设置模式为trunk 并允许所有vlan通过 交换机连接路由器端口…

C/C++每日一练(20230224)

目录 1. 字符串排序 2. Excel表列名称 3. 颠倒二进制位 附录&#xff1a; 位移运算符 左移运算符<< 1.无符号 2.有符号 右移运算符>> 1.无符号 2.有符号 程序测试 1. 字符串排序 编写程序&#xff0c;输入若干个字符串。 要求: &#xff08;1&#x…

C++学习笔记-类和对象

##类与对象的思想 面向对象的特点&#xff1a;封装、继承、多态 面向对象编程的特点&#xff1a; &#xff08;1&#xff09;易维护&#xff1a;可读性高&#xff0c;即使改变了需求&#xff0c;由于继承的存在&#xff0c;只需要对局部模块进行修改&#xff0c;维护起来非常方…

华为OD机试题,用 Java 解【高矮个子排队】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

如何通过jar包得知maven坐标,以及如何替换依赖的依赖的版本

问题一&#xff1a;我只能得到这个jar包的名字&#xff0c;如果得知这个jar包的maven坐标&#xff08;groupId以及artifactId&#xff09;&#xff1f; 思路1&#xff1a;将jar包的名字&#xff08;去除版本号&#xff09;在mvn仓库中搜索&#xff0c;地址&#xff1a;https:/…

从ChatGPT出发:大模型与自然语言模型

目录引言基石故事的开始&#xff1a;Transformer异姓兄弟&#xff1a;GPT、Bert与GPT-2GPTBertGPT-2大力出奇迹&#xff1a;GPT3模型的进化&#xff1a;InstructGPTChatGPT代码库TransformerGPT-2GPT-3InstructGPT未来的工作安全性&有效性算力与标注代价的平衡参考文献引言…

LeetCode——2357. 使数组中所有元素都等于零

一、题目 给你一个非负整数数组 nums 。在一步操作中&#xff0c;你必须&#xff1a; 选出一个正整数 x &#xff0c;x 需要小于或等于 nums 中 最小 的 非零 元素。 nums 中的每个正整数都减去 x。 返回使 nums 中所有元素都等于 0 需要的 最少 操作数。 来源&#xff1a;力…