1. # include <stdio.h> 
  2.  
  3. struct X 
  4.     int a; 
  5.     char b; 
  6.     int c; 
  7. }; 
  8. int main(void
  9.     printf("%d\n",sizeof(struct X)); 
  10.  
  11.     return 0; 
  12.  
  13.  
  14.  
  15. # include <stdio.h> 
  16.  
  17. struct Y 
  18.     int a; 
  19.     char b; 
  20.     int c; 
  21.     char d; 
  22. }; 
  23.  
  24. int main(void
  25.     printf("%d\n",sizeof(struct X)); 
  26.     return 0; 

 这个代码会输出什么?

a) 9,10
b)12, 12
c)12, 16

答案是C,我想,你一定知道字节对齐,是向4的倍数对齐。

  • 但是,你知道为什么要字节对齐吗?还是因为性能。因为这些东西都在内存里,如果不对齐的话,我们的编译器就要向内存一个字节一个字节的取,这样一来,struct X,就需要取9次,太浪费性能了,而如果我一次取4个字节,那么我三次就搞定了。所以,这是为了性能的原因。
  • 但是,为什么struct Y不向12 对齐,却要向16对齐,因为char d; 被加在了最后,当编译器计算一个结构体的尺寸时,是边计算,边对齐的。也就是说,编译器先看到了int,很好,4字节,然后是 char,一个字节,而后面的int又不能填上还剩的3个字节,不爽,把char b对齐成4,于是计算到d时,就是13 个字节,于是就是16啦。但是如果换一下d和c的声明位置,就是12了。

 

转自 : http://coolshell.cn/articles/5761.html 感谢酷壳博客的辛勤奉献。