关于结构体有一个字节对齐和字节补齐的问题
对齐原则是:分配空间要是该类型数据大小的倍数即为有char为1的倍数,有short为2的倍数,
有int为4的倍数,有double为8的倍数(关于int和double一般都是4的倍数)
补齐原则是:整个结构体变量的长度补成这里面最大的那个成员大小的倍数,如果大小超过4
就按4的倍数
所以你这个结构的大小具体要这样算
a是个整形4个字节没啥说的,继续到b是个字符型1个字节4是1的倍数所以不用使用对齐原则此时结构体大小为5,再到c短整型2个字节5不是2的倍数所以要对齐一下直接到6再加上c的大小此时结构体大小为8,再到d字符型1个字节8是1的倍数所以不用对齐直接加上此时结构体大小为9,最后因为9不是a的大小倍数要使用补齐原则不上3为12也就是最终结构体的大小
对齐原则是:分配空间要是该类型数据大小的倍数即为有char为1的倍数,有short为2的倍数,
有int为4的倍数,有double为8的倍数(关于int和double一般都是4的倍数)
补齐原则是:整个结构体变量的长度补成这里面最大的那个成员大小的倍数,如果大小超过4
就按4的倍数
所以你这个结构的大小具体要这样算
1
2
3
4
5
6
7
|
struct
s1
{
int
a;
//此时是4
char
b;
//此时是5
short
c;
//对齐一下直接冲6开始,此时是8
char
d;
//此时是9,补齐3个字节最后为12
};
|
a是个整形4个字节没啥说的,继续到b是个字符型1个字节4是1的倍数所以不用使用对齐原则此时结构体大小为5,再到c短整型2个字节5不是2的倍数所以要对齐一下直接到6再加上c的大小此时结构体大小为8,再到d字符型1个字节8是1的倍数所以不用对齐直接加上此时结构体大小为9,最后因为9不是a的大小倍数要使用补齐原则不上3为12也就是最终结构体的大小