搞不清__attribute__((aligned(n)))与__attribute__((packed))

091b8af44a3c4c43c0392278d5dd09f5.gif

正文


大家好,我是bug菌~

前段时间分享了一篇手动对齐方式设置的文章<Keil中三种手动结构体对齐方式,别用错了~>,然后有朋友私信我问到,为什么使用__attribute__((aligned(1)))进行属性声明的结构体大小不能达到__attribute__((packed))的效果,然后跟他聊了小一会,那么今天就以此文再总结总结。

1

默认对齐

其实所谓的对齐,主要是包括两个内容,数据地址的对齐与数据结构的填充,数据地址的对齐主要是方便CPU的访问,然而为了完成数据地址对齐,对于结构体数据需要插入一些无意义的数据,我们也叫数据填充。

在没有手动指定对齐方式的时候,编译器通常会进行默认自动对齐,像STM32默认采用的是自然对齐方式。在自然对齐方式下,数据类型的起始地址必须是其大小的整数倍。例如,一个四字节(32位)的整数必须从一个地址处开始,这个地址是4的倍数,都是为了提高内存访问效率。在许多存储器系统中,以4字节为单位进行访问速度更快,因为它与内存总线的宽度相匹配。这样可以减少读取和写入操作的次数,提高数据传输速率,从而提高系统性能。

2

对比

__attribute__((aligned(n))其实有很多种用法,而且其放在什么位置修饰什么内容也会产生不同的效果,最常用的就是直接修饰变量,使得变量的地址对齐到设置的对齐个数上来。

比如:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最后一个bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值