* 申明一下情况都是在32位机器上*
情形一
typedef struct{
char name[3];
int age;
double score;
}Student;
按double 类型的长度的整数倍对齐
32位机器原始数据类型:
char name 占1个字节
int age 占4个字节
double score 占8个字节
假如结构体初始化如下
name=”LYH”;
age=26;
score=100;
对应的内存模型为:
情形二
当把结构体的顺序调换一下时:
typedef struct{
char name[3];
double score;
int age;
}Student;
结构体初始化如下
name=”LYH”;
score=100;
age=26;
此时对应的内存模型为:
情形三
对于复杂类型的数据结构
比如
typedef struct
{
int number;
Student A;
char name[3];
} Class;
初始化为:
number为50
name=”LYH”
A的初始化和上面相同。
这里包含了另一个结构体的大小,此时sizeof(Class)的大小为:
因为Student结构体中是按照double 类型的长度对齐,所以在Class的结构体中对齐也是按double 类型的长度对齐,故总大小为(4+4)+24+(3+5)=40字节。
此时的内存模型是:
情形四
如果把class修改如下
typedef struct
{
int number;
char name[3];
Student A;
} Class;
那么sizeof(Class)又是占多少字节?是32还是40?
总之:对齐后的大小为最长数据类型的最小整数倍大小。