首先让我们来看代码
struct S
{
char a;
int b;
};
// VS 中默认对齐数为 8
// a 的大小为1 所以 1 | 8 中 1 比较小所以对齐数为1 即开头的位置距结构体的地址是 1 的倍数
// b的大小为4 所以4 | 8 中 4 比较小所以对齐数为 4 即开头的位置距结构体的地址是 4 的倍数
// 由于 a 占一个字节所以 b 要在 字节偏移量为4的位置 开始存放
// 并且结构体的总大小为 结构体中所占字节最大和默认对齐数中较小的那个的整数倍 即结构体总大小为4的倍数
// 所以结构体大小 为 8
让我们再来看下一个
struct SS
{
char a;
char b;
int c;
};
// a的大小为 1 所以1 | 8 中1比较小所以偏移量为 1 个字节 即开头的位置距结构体的地址是 1 的倍数
// b的大小为1 所以1 | 8 中1比较小所以偏移量为 1 个字节 即开头的位置距结构体的地址是 1 的倍数
//c的大小为4 所以 4 | 8 中4比较小所以偏移量为 4 个字节 即开头的位置距结构体的地址是 4 的倍数
// 并且结构体的总大小为 结构体中所占字节最大和默认对齐数中较小的那个的整数倍结 即结构体总大小为4的倍数
// 所以结构体大小 为 8
struct SSS
{
char a;
int b;
char c;
};
// 1 | 8 中1比较小所以偏移量为 1 个字节 即开头的位置距结构体的地址是 1 的倍数
// 4 | 8 中4比较小所以偏移量为 4 个字节 即开头的位置距结构体的地址是 4 的倍数
// 1 | 8 中1比较小所以偏移量为 1 个字节 即开头的位置距结构体的地址是 1 的倍数
// 并且结构体的总大小为 结构体中所占字节最大和默认对齐数中较小的那个的整数倍 即结构体的总大小为4的倍数
// 所以结构体大小 为 12
由上可知当我们创建结构体时最好将所占字节小的放在一起,这样可以节省空间。
struct SSS
{
char a;
int b;
char c;
};
struct AA
{
struct SSS;
char e;
int f;
double m;
};
//由上面可知 sturct SSS 所占字节大小为12
// e 的大小是1 所以1 | 8 中较小的是1 所以 e 的偏移量为 1 的倍数
// f 的大小为 4 所以4 | 8 中较小的是4 所以 f 的偏移量为 4 的倍数
// m 的大小为8 所以8 | 8 中较小的是8 所以 m 的偏移量为 8 的倍数
// 并且结构体的总大小为 结构体中所占字节最大和默认对齐数中较小的那个的整数倍,即结构体总大小为8的倍数。
//所以结构体大小为 32