字节对齐及其相关实现语句
前言
在CSDN摸鱼数年,这篇blog终于结束了我的“白嫖”生涯,希望借此可以将自己遇到的问题与想法记录下来方便自己温习,当然如果有幸能帮助到一些人也是极好的。恰巧最近遇到字节对齐的bug,查阅资料与实际测试后在此分享一些自己的理解。
字节对齐概念
字节对齐常用在结构体、联合以及一些数组定义中,因结构体中成员类型多种多样,在程序中考虑CPU访问效率以及内存管理的时候经常会用到字节对齐。
所谓“字节对齐”是指变量存储地址是其类型长度的整数倍,例如int型变量设置字节对齐后其存储地址应是4的整数倍,同理short型变量其存储地址应该是2的整数倍。
字节对齐的目的
上一小节已经提到在考虑CPU访问效率以及内存管理的时候经常会用到字节对齐。当数据存储地址是字节对齐的时候,CPU只需读取一次即可将数据全部取到。若不是字节对齐的,则要读取数次,如下图所示,如果将int型数据存储在0x01处,则其存储地址范围为0x01-0x04,则CPU在读取数据时要先后读取0x00-0x01、0x02-0x03、0x04-0x05,最后保留有效数据组合成一个整型数据(从一篇文章中看到的解释)。
1、字节对齐实现方法:__attribute__((aligned(n)))
__attribute__((aligned(n)))语句中:
n = 2 i n=2^i n=2ii为非负整数。下面看一下程序及实际执行后的结果:
/2字节对齐*/
typedef struct __attribute__((aligned(2))){
char m1;
short m2;
char m3;
} a_t;
a_t a;
运行结果:
结构体字节长度:6
成员起始地址:
m1:536887516
m2<