虽然有的文章中指出,结构体分配内存的大小要考虑的有成员数据类型大小和结构体类型大小
例如:
struct test1{
char a;
int b;
char c;
}
编译器在分配内存空间的时候a分配完分配b然后才是c,由于结构体中成员内存空间是连续的,为了保证对齐,申请完char a的1个字节以后,要补到int型的4字节保持对齐,所以是1+3(补)+int型的4+char的1+3(补)=12,如果两个比较短的比如char放在一起变成
struct test2{
char a;
char c;
int b;
}
或者int b在最前,只要保证两个小的分配内存是相邻,那编译器就会进行优化,把两个char型放在一起,然后补上2个达到int的4个字节对齐。
其实这里有个没注意的地方,如果int型改成double型呢
struct test3{
int a;
double b;
int c;
}
这样子很多人会认为是24,因为int要补够到double的8字节,但是实际结果是16,为什么呢?
查了很多资料后发现,实际上编译器在补齐操作的时候是不认16或者8字节补齐的,因为 为了考虑内存读取的效率,32位的内存访问是以4字节为基数,也就是说8个字节的数据要分成2次访问,所以对于超过4字节的数据类型,结构体分配空间的时候不再以8字节补齐,而是以4字节补齐,提高内存访问效率,这里int改成char 也一样是16.