3句话总结
类型对齐都是采用用和int类型一样长度来对其,也就是32位系统或是64位系统这样的值。
1、结构体中成员的相对地址,一定要是元素本身类型长度的整数倍
例:
struct tmp
{
char a;
char b;
float c;
char d;
doble e;
char f;
}
变量名 类型长度 相对地址
a 1 0
b 1 1 ------后面补齐2个字节
c 4 4 -----相对地址必须是本身类型的整数倍
d 1 8 -----后面必须补齐7个字节
e 8 16 -------相对地址必须是本身类型的整数倍,由于地址8已经有值,所以必须到16的地址,前面必须补齐7字节
f 1 24
2、整个结构体的长度,必须是类型最大成员的长度整数倍
比如上面例子中整个结构体的长度应该是32。是doble的整数倍。
而不是24 + 1, 不是 8 的整数倍。
3、无论结构体中是否有内嵌结构体都是按所有结构体中基本类型最大的对齐
例
struct temp
{
int temp_a;
char temp_b;
}
struct py
{
char a;
sturct temp b;
double c;
}
变量名 类型长度 相对地址
a 1 0
b->temp_a 4 4 ------因为地址必须是类型长度的整数倍,所以前面要补齐3字节
b->temp_a 1 8
c 8 16 -------相对地址必须是本身类型的整数倍,由于地址8已经有值,所以必须到16的地址,前面必须补齐7字节