内存对齐的含义:
1.在处理结构体内的成员时,每个成员在内存中的起始地址必须是成员类型所占字节数的整数倍。
2.另外,还有一条重要规则,sizeof计算结果必须是结构体中占用内存最大变量的内存的整数倍。
3.最后,注意在数据内存对齐,要以结构体中最深层的基本数据类型为准。
关于sizeof计算结构体占用的内存问题,看三个例子:
目的是为了方便加快数据的读取速度,减少指令周期等。
struct s1{
char a;
short b;
int c;
double d;
};
//sizeof(s1) :16
分析:
开始,char a占1个字节,起始地址为0;后面short b占2字节,起始地址必须为2的整数倍,故地址为1的内存空出来,b 从地址为2处开始放,占用2字节;接着int c 占4个字节,此时放完b后,后面一位的地址为4,正好为int整数倍,故放c,占4字节。最后放完c后,后面一位地址是8,正好放double b,占8个字节。故s1内存占16字节。且16为8的整数倍。
struct s1{
char a;
short b;
double c;
int d;
};
//sizeof(s2) :24
分析,开始,char a占1个字节,起始地址为0;后面short b占2字节,起始地址必须为2的整数倍,故地址为1的内存空出来,b 从地址为2处开始放,占用2字节;放完b后,后一位地址为4,而double c内存为8,故地址5,6,7空出来,c从地址8开始放,占8个字节;放完c后,后一位地址为16,正好放 int d,占4字节,故s2本应为19字节。但考虑到上述规则,s2的大小为8的整数倍,故空出20,21,22,23.
实际为24字节。
struct s1{
int i;
};
struct s2{
char a[4];
};
struct s3{
s1 a;
char b;
};
struct s4{
s2 a;
char b;
};
//sizeof(s3) ==8;
//sizeof(s4) ==5;
分析:
s3中,a占4个字节,b占1字节,s3本应为5字节,考虑s3字节是最大数据类型整数倍,故为8;
s4中,a占4字节,b占1字节,s4本应为5字节,考虑s4字节是最大数据类型整数倍,根据规则3,s4的基本数据类型仍为char,故s4字节为5.