设为首页 加入收藏

TOP

6.3 sizeof(2)
2013-10-07 14:08:57 来源: 作者: 【 】 浏览:60
Tags:6.3 sizeof

6.3  sizeof(2)

解析:在访问内存时,如果地址按4字节对齐,则访问效率会高很多。这种现象的原因在于访问内存的硬件电路。一般情况下,地址总线总是按照对齐后的地址来访问的。例如你想得到0x00000001开始的4字节内容,系统首先需要以0x00000000读4字节,从中取得3字节,然后再用0x00000004作为开始地址,获得下一个4字节,再从中得到第一个字节,两次组合出你想得到的内容。但是如果地址一开始就是对齐到0x00000000,则系统只要一次读写即可。

考虑到性能方面,编译器会对结构进行对齐处理。考虑下面的结构:

  1. struct aStruct  
  2. ...{  
  3.                char cValue;  
  4.                int    iValue;  
  5. }; 

直观地讲,这个结构的尺寸是sizeof(char)+sizeof(int)=6,但是在实际编译下,这个结构尺寸默认是8,因为第二个域iValue会被对齐到第4个字节。

在VC中,我们可以用pack预处理指令来禁止对齐调整。例如,下面的代码将使得结构尺寸更加紧凑,不会出现对齐到4字节问题:

  1. #pragma pack(1)  
  2. struct aStruct...{  
  3.      char cValue;  
  4.     int     iValue;  
  5. };  
  6. #pragma pack() 

对于这个pack指令的含义,大家可以查询MSDN。请注意,除非你觉得必须,否则不要轻易做这样的调整,因为这将降低程序的性能。目前比较常见的用法有两种,一是这个结构需要被直接写入文件;二是这个结构需要通过网络传给其他程序。

注意:字节对齐是编译时决定的,一旦决定则不会再改变,因此即使有对齐的因素在,也不会出现一个结构在运行时尺寸发生变化的情况。

在本题中,第一种类的数据对齐是下面的情况:

¦bool¦----¦----¦----¦ < xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

¦-------int---------¦

¦bool¦----¦----¦----¦

第二种类的数据对齐是下面的情况:

¦-------int---------¦

¦bool¦bool¦----¦----¦

所以类的大小分别是3×4和2×4。

答案:B类输出12字节,C类输出8字节。

面试例题3:求解下面程序的结果。[中国著名通信企业H公司面试题]

  1. #include <iostream> 
  2. using namespace std;  
  3.  
  4. class A1  
  5. {  
  6. public:  
  7. int a;  
  8. static int b;  
  9.  
  10. A1();  
  11. ~A1();  
  12. };  
  13.  
  14. class A2  
  15. {  
  16. public:  
  17. int a;  
  18. char c;  
  19. A2();  
  20. ~A2();  
  21. };  
  22.  
  23. class A3  
  24. {  
  25. public:  
  26. float a;  
  27. char c;  
  28. A3();  
  29. ~A3();  
  30. };  
  31.  
  32. class A4  
  33. {  
  34. public:  
  35. float a;  
  36. int b;  
  37. char c;  
  38. A4();  
  39. ~A4();  
  40. };  
  41.  
  42. class A5  
  43. {  
  44. public:  
  45. double d;  
  46. float a;  
  47. int b;  
  48. char c;  
  49. A5();  
  50. ~A5();  
  51. };  
  52.  
  53. int main() {  
  54.     cout<<sizeof(A1)<<endl;  
  55.     cout<<sizeof(A2)<<endl;  
  56.     cout<<sizeof(A3)<<endl;  
  57.     cout<<sizeof(A4)<<endl;  
  58.     cout<<sizeof(A5)<<endl;  
  59.     return 0;  

解析:因为静态变量是存放在全局数据区的,而sizeof计算栈中分配的大小,是不会计算在内的,所以sizeof(A1)是4。

为了照顾数据对齐,int大小为4,char大小为1,所以sizeof(A2)是8。

为了照顾数据对齐,float大小为4,char大小为1,所以sizeof(A3)是8。

为了照顾数据对齐,float大小为4,int大小为4,char大小为1,所以sizeof(A3)是12。

为了照顾数据对齐,double大小为8,float大小为4,int大小为4,char大小为1,所以sizeof(A3)是24。

答案:4,8,8,12,24。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇6.3 sizeof(3) 下一篇在企业中越来越流行的8种编程语言

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: