byte 1字节
char 2字节(C语言中是1字节)可以存储一个汉字
short 2字节
int 4字节
long 8字节
float 4字节
double 8字节
boolean false/true(理论上占用1bit,1/8字节,实际处理按1byte处理)
现在给出一个结构体,我们针对win-32和Linux-32进行分析,例1:
struct MyStruct
{
char a;
int b;
long double c;
};
**解答** :
**win-32位系统下** :
由上图可知该结构体的最大对齐模数为sizeof(long double)=8;假设MyStruct从地址空间0x0000开始存放。char为1个字节,所以a存放于0x0000中;int为4个字节,根据规则,b存储的起始地址必须为其对齐模数4的整数倍,所以a后面自动填充空缺字节空间0x0001-0x0003,因此b存放于0x0004-0x0007中。long double是8个字节,由于32位系统每次最多分配4个字节,则首先分配0x0008-0x000B,由于不够存储空间,则继续分配0x000C-0x000F,所以c存储在0x0008-0x000F中,由于此时总存储空间为4+4+8=16;则16满足最大对齐模数sizeof(long double)=8的整数倍;因此,sizeof(MyStruct)=16个字节.
**Linux-32位系统下:**
由上图可知该结构体的最大对齐模数为4;假设MyStruct从地址空间0x0000开始存放。char为1个字节,所以a存放于0x0000中;int为4个字节,根据规则,b存储的起始地址必须为其对齐模数4的整数倍,所以a后面自动填充空缺字节空间0x0001-0x0003,因此b存放于0x0004-0x0007中。long double是12个字节,由于32位系统每次最多分配4个字节,则首先分配0x0008-0x000B,由于不够存储空间,则继续分配0x000C-0x000F,仍然不满足存储c,则继续分配0x0010-0x0013,所以c存储在0x0008-0x0013中,由于此时总存储空间为4+4+12=20;则20满足最大对齐模数4的整数倍;因此,sizeof(MyStruct)=20个字节。