计算结构体字节数的关键是搞明白字节对齐。
字节对齐是为了提高内存访问的效率与速度,它的细节和编译器实现有关,但一般而言,遵循以下规则:
- 结构体变量的首地址是结构体中最宽基本类型成员的大小的倍数;
- 结构体每个成员相对于结构体首地址的偏移量都是该成员内存大小的整数倍,也就是说相邻的两个不同类型的成员之间可能需要填充字节,填充至相邻两成员的最小公倍数;
- 结构体所占的总内存大小应为结构体中最宽基本类型成员的倍数,也就是可能在最后一个成员之后填充字节。
- 注意:结构体不算作基本类型成员。
按照这个规则,可以得出以下结构体所占的内存为 24 字节:
struct node {
char a; // 1 字节,但会填充至 4 字节
int b; // 4 字节,至此共 8 字节,与 long long 相同,不需要填充
long long c; // 8 字节,至此共 16 字节
char d; // 1 字节,至此共 17 字节
// 结构体总大小必须为 8 的整数倍,所以填充至 24 字节
};