内存对齐
1.说明:
- 第一个成员起始于0偏移处
每个成员按其指定大小和指定对齐参数n中较小的一个进行对齐
1.偏移地址和成员占用大小均需对齐
2.结构体成员对齐参数为其所有成员使用对齐参数的最大值结构体总长度必须为所有对齐参数的整数倍
2.示例说明:
示例1:
说明:默认为#pragma pack(4),也就是按4个字节大小对齐
struct test
{
char c1;//大小:1 对齐:4 起始位置:0 大小:1 空白:0
short s;//大小:2 对齐:4 起始位置:2 大小:2 空白:1
char c2;//大小:1 对齐:4 起始位置:4 大小:1 空白:0
int i; //大小:4 对齐:4 起始位置:8 大小:4 空白:3
}; //结构体大小为上面的所有对齐参数的整数倍
int main()
{
printf("%d\n", sizeof(struct test)); //结果为12(2+2+4+4)
return 0;
}
- 示例2:
#pragma pack(8) //按8个字节大小对齐,linux下默认4字节对齐,会直接忽略此条语句
struct s1
{
short a;//大小:2 对齐:8 起始位置:0 大小:2 空白:0
long b; //大小:4 对齐:8 起始位置:4 大小:4 空白:2
};
//这里的long是32位编译器的结果,编译器不同结果不同
struct s2
{
char c; //大小:1 对齐:8 起始位置:0 大小:1 空白:0
struct s1 d;//大小:4 对齐:8 起始位置:4 大小:8 空白:3
double e; //大小:8 对齐:8 起始位置:16 大小:8 空白:4
};
//结构体里面有结构体的对齐方式是取里面的结构体对齐数的最大的
int main()
{
struct s2 s;
printf("%d\n", sizeof(struct s1)); //8
printf("%d\n", sizeof(struct s2)); //24
printf("%d\n", (int)&(s.d) - (int)&(s.c)); //4
return 0;
}