C语言内存字节对齐小结
两句话
(1)各成员变量在结构体(类)中的地址偏移是自身大小(或与指定对齐系数之间较小者)的整数倍;
(2)结构体(类)大小是最大成员变量(或与指定对齐系数之间较小者)整数倍;
环境
在64位机器环境。
1、举例一:
struct AA{
char a;
int b;
char c;
}aa;
结果,sizeof(aa)=12
分析:
a占1Byte;b占4Byte,b的偏移为自身大小(4Byte)整数倍,所以a后面有3Byte补齐,所以到b有8Byte;c占1Byte,此时总共9Byte。又因为总数为最大成员(b,占4Byte)整数倍,所以后面又有3Byte补齐,总共12Byte。
2、举例二:
struct AA{
char a;
char c;
int b;
}aa;
sizeof(aa)=8
3、举例三:
#pragma pack(2)//取最小
struct AA{
char a;
int b;
char c;
}aa;
sizeof(aa)=8
如果pragma pack和__attribute__
同时指定呢?以__attribute__ 的为准。
需要说明的是,不管pragma
pack和__attribute__如何指定,结构体内部成员的自对齐仍然按照其自身的对齐值。