#include <stdio.h>
#include <string.h>
struct S1 {
char a;//1
int b;//4
char c;//1
};
//分析 默认对齐数 成员对齐数 对齐数(前两个最小值) 最大对齐数
// 8 1 1 4
// 8 4 4
// 8 1 1
//结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍
typedef struct S2 {
int a;//4
char b;//1
int c;//4
char d;//1
}SS2;
int main() {
struct S1 s1;
printf("%lld %zu", sizeof(s1), sizeof(struct S1));//12 12
printf("%zu", sizeof(SS2));//16
return 0;
}
总结:
结构体的对齐规则:
1. 第一个成员在与结构体变量偏移量为 0 的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
默认对齐数 成员对齐数(成员大小)对齐数=默认对齐数 VS 成员对齐数(成员大小)中的较小值
对齐数 = 编译器默认的一个对齐数 与 该成员大小的 较小值
VS 中默认的值为 8
linux中默认值为 4
3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 ***
#include <stdio.h>
struct num
{
double a;//8
char b;//1
int c;//4
char d;//1
};
int main() {
printf("%lld", sizeof(struct num)); //24
return 0;
}