最近的项目中使用到了大量的结构体,忽然想到了结构体中的还有内存对齐的问题,结构体中变量顺序的不同,会造成这个结构体对象在内存中实际占有的大小也是不同的。先上代码,然后再说结论:
#include <stdio.h>
typedef struct{
char a;
short b;
long c;
}ST_CHAR_SHORT_LONG;
typedef struct{
short b;
char a;
long c;
}ST_SHORT_CHAR_LONG;
typedef struct{
short b;
long c;
char a;
}ST_SHORT_LONG_CHAR;
int main(){
printf("char size = %d\n",sizeof(char));
printf("short size = %d\n",sizeof(short));
printf("long size = %d\n",sizeof(long));
printf("ST_CHAR_SHORT_LONG size = %d\n",sizeof(ST_CHAR_SHORT_LONG));
printf("ST_SHORT_CHAR_LONG size = %d\n",sizeof(ST_SHORT_CHAR_LONG));
printf("ST_SHORT_LONG_CHAR size = %d\n",sizeof(ST_SHORT_LONG_CHAR));
return 0;
}
以上代码运行后的结果是:
char size = 1
short size = 2
long size = 4
ST_CHAR_SHORT_LONG size = 8
ST_SHORT_CHAR_LONG size = 8
ST_SHORT_LONG_CHAR size = 12
以上三个结构体,明明成员类型和数量都是一样的,反而在内存中世纪占用的空间不同,这是怎么回事呢?
原来CPU为了提高内存的读写效率,会自动对齐内存空间,对齐的原则是什么呢?
1. 结构体中的第一个成员放在起始位置0,剩余的成员会依次放在第一个成员所占空间大小倍数的位置。比如第一个成员变量是long类型的,所占空间是4个字节,后面的成员会依次存放距离开始位置在4、 8、 12…的位置;
2. 整个结构体的大小是成员变量中占用最大字节数的整数倍;
以上!
aaa