linux的对齐策略是 2字节数据类型的地址必须是2的倍数,而较大的数据类型(例如 int, int *, float, double,long long)的地址必须是4的倍数.
windows的对齐策略更加严格,认可k字节基本类型对象的地址都必须是K的倍数.
结构体的对齐,除了每个结构体成员对齐以外,还要满足,结构体的大小是结构体中最大对齐字节的倍数.结构体本身的对齐以结构体中所有成员中最大的对齐字节来进行.
struct
S1
{
char
c;
double
i;
};
struct
S2
{
char
c1;
S1
s;
char
c2;
};
在linux 中, double的对齐字节是4,而linux中,double的对齐字节是8
linux 中,上面的S1的字节数是12,S2的字节数是20
windows中,上面的S1的字节数是16,S2的字节数是32
存在#pragma pack宏的对齐(
另外,在GNU C中还有一个
__attribute__ ((aligned (N)))
指令,可以达到类似的效果。
)
对齐规则:
结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和自身对齐模数中较小的那个。
例8:按指定的对齐模数
在结构体G中成员变量的最大对齐模数是sizeof(double)=8;又因为指定对齐模数是2;所以取其较小者2为结构体G的最大对齐模数;则sizeof(G)=2+4+8+2=16;由于16是2的整数倍,则不需要填充。