结构体数据成员的对其原则
结构体默认的字节对齐一般满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量( offset )都是成员自身大小的整数倍,如有需要编译器会在成员之间加上填充字节( internal adding );
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节( trailing padding )。
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量( offset )都是成员自身大小的整数倍,如有需要编译器会在成员之间加上填充字节( internal adding );
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节( trailing padding )。
实例代码
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
typedef struct s1{
int a;
char b;
double c;
}s1;
typedef struct s2{
char a;
double b;
int c;
}s2;
int main()
{
s2 s;
printf("sizeof(s1) = %u\nsizeof(s2) = %u\n",sizeof(s1),sizeof(s2));
printf("&s.a = %p\n&s.b = %p\n&s.c = %p",&s.a,&s.b,&s.c);
return 0;
}
打印结果如下:
对于S2,查看其数据成员的起始地址发现
char类型的变量a占用1个字节,double类型的变量b的起始地址与a的起始地址的偏移量为8,满足对其原则(2),int类型的变量c的起始地址与b的相比,偏移量为8满足原则(2)。对于整个结构体的大小(24)满足原则(3);