《结构体字节对齐最简单的解释》由会员分享,可在线阅读,更多相关《结构体字节对齐最简单的解释(3页珍藏版)》请在金锄头文库上搜索。
1、一、 字节对齐 原则:一个变量的首地址必须满足相应的字节对齐(即首地址必须是某一个值的整数倍)。其中这个值叫做有效字节对齐值。且该变量所占的内存大小必须是有效对齐值的整数倍。 说明: 变量有两种类型 1、 单一变量,如:char,int,double; 2、 结构体变量。(结构体里既会存在单一变量,又会存在结构体变量) 有效对齐值与以下两种对齐值有关 1、 自身对齐值 对于单一变量,自身对齐值就是该变量所占的内存大小。 对于结构体变量,自身对齐值就是结构体成员自身对齐值中最大的一个。 2、 指定对齐值 用程序自定对齐值。 #pragma pack(2) /开始 #pragma pack() /
2、结束 代表指定 2 字节对齐 如果没有指定对齐值,那么有效对齐值就是变量的自身对齐值;如果指定对齐值,那么有效对齐值就是这两个对齐值中的小者。 由以上说明就可以知道一个结构体变量所占的真实字节数了。 下例中所有结构体的起始地址都假设从 0 开始 例 1: struct a char no10; /没有指定对齐值,所有有效对齐值为自身对齐值,即1;所以占用地址 0-9 int p; /没有指定对齐值,所有有效对齐值为自身对齐值,即 4;所以占用地址 12-15 long int pp; /没有指定对齐值,所有有效对齐值为自身对齐值,即4;所以占用地址 16-19 unsigned int ppp
3、;/ 没有指定对齐值,所有有效对齐值为自身对齐值,即 4;所以占用地址 20-23 char x; /没有指定对齐值,所有有效对齐值为自身对齐值,即 1;所以占用地址 24 float y; /没有指定对齐值,所有有效对齐值为自身对齐值,即 4;所以占用地址 28-31 double h; /没有指定对齐值,所有有效对齐值为自身对齐值,即 8;所以占用地址 3239 /该结构体变量该结构体变量没有指定对齐值没有指定对齐值,所以所以有效对齐值就是这些有效对齐值就是这些成员中自身对齐成员中自身对齐值中最大的一个,即值中最大的一个,即 8;该结构体最后一该结构体最后一个成员结束后,所占的内存空间大小
4、已经是有效对齐值个成员结束后,所占的内存空间大小已经是有效对齐值的的整数整数倍了,倍了,所以不需要所以不需要再再加上填充字节了。加上填充字节了。 xy; 例 2: struct S1 char c; int i; ; /占 8 字节 struct S3 char c1; S1 s; char c2; ; /占 16 字节 例 3: #pragma pack(2) / 必须在结构体定义之前使用 struct S1 char c; int i; ; /占 6 字节 struct S3 char c1; S1 s; char c2; ; /占 10 字节 #pragma pack() / 结束 WtYj