先了解4个基本概念:
1、数据类型自身对齐值:即数据类型的大小(数组取数组成员类型的自身对齐值),如char的自身对齐值是1,short是2,int、float、double都是4,单位字节
2、结构体的自身对齐值:结构体成员中自身对齐值最大的那个值
3、指定对齐值:使用#pragma pack (value)时指定的对齐值alue
4、有效对齐值:自身对齐值和指定对齐值中较小的那个值
其次,数据存放必须满足以下两个法则:
法则1:有效对齐值为N的数据在内存中存放的起始地址必须是N的整数倍,即满足“存放起始地址 # N = 0”
法则2:结构体的变量占用的总长度必须是结构体有效对齐值的整数倍
有了以上基础,就能判断一个结构体占用内存的空间大小,下面举几个例子分析:
struct B
{
char b;
int a;
short c;
}
假设B从0x0000开始存放,并且默认编译环境默认的指定对齐值是4。第一个成员变量b的自身对齐值是1,比指定对齐值4小,所以有效对齐值是1,所以存放在0x0000空间。第二个成员a的自身对齐值是4,指定对齐值亦是4,所以有效对齐值是4,其存放起始气质必须是4的整数倍,所以必须存放在0x0004~0x0007空间。第三个成员c的自身对齐值是2,比指定对齐值4小,所以有效对齐值是2,紧接a占用空间的下一个起始地址0x0008满足2的整数倍,所以存放在0x0008~0x