织梦CMS - 轻松建站从此开始!

罗索

关于sizeof(Class)的学习

jackyhwei 发布于 2013-07-09 19:22 点击:次 
落鹤生:曾经被问到的一个面试题。如果类中含有虚函数,无论有多少虚函数,类将为这些虚函数建一张虚表
TAG:

  1. #include <iostream> 
  2. #include <string> 
  3.  
  4. using namespace std; 
  5. class Base 
  6. public
  7.           //每个自动成员变量占用一定的空间  
  8.           int m_a; 
  9.           Base(){cout<<"Base-ctor"<<endl;} 
  10.           ~Base(){cout <<"Base-dtor"<<endl;} 
  11.           void g2(int i=10) {cout <<"Base::g2()"<<i<<endl;} 
  12.           //成员函数不占用sizeof的空间  
  13. private
  14.           int m_b; 
  15. }; 
  16. //发生类继承时,子类直接把所有父类的sizeof全部复制到子类, 
  17. //并根据子类的情况决定是否加大尺寸  
  18. class Derived : public Base 
  19. public
  20.        Derived(){cout <<"Derived-ctor"<<endl;} 
  21.        ~Derived(){cout<<"Derived-dtor"<<endl;} 
  22.        //如果类中含有虚函数,无论有多少虚函数,类将为这些虚函数建一张虚表 
  23.        //占用4Bytes的大小  
  24.        virtual void g(int i=20){cout<<"Derived::g()"<<i<<endl;} 
  25. }; 
  26.  
  27. //如果对一个空的类进行sizeof操作,结果将是1Byte  
  28.  
  29. class A 
  30. public
  31.       double m_d; 
  32.       //虚表 4Bytes ,为了保持内存对齐 ,额外消耗4Bytes  
  33.       virtual void func1(){} 
  34. }; 
  35.  
  36. class A1:public A{}; 
  37. class A2:public A{}; 
  38.  
  39. //原封不动的继承  
  40. class B : public A{}; 
  41.  
  42. //虚继承 原来没有虚表 除了复制内容外 还需要添加虚表  
  43. class C : public virtual A1,public virtual A2{}; 
  44.  
  45. //多重继承 直接复制父类的内容  
  46. class D : public A1,public A2{}; 
  47.  
  48. int main() 
  49.     Base b; 
  50.     Derived d; 
  51.     Base *pb = new Derived; 
  52.      
  53.     cout <<sizeof(Base)<<" BASE"<<endl; 
  54.     cout <<sizeof(b)<<"base"<<endl; 
  55.     cout <<sizeof(*pb)<<"(Base)*(&Derived)"<<endl; 
  56.     cout <<sizeof(pb)<<"&Derived"<<endl; 
  57.     cout <<sizeof(Derived) <<"DERIVED"<<endl; 
  58.     cout <<sizeof(d) <<"derived" <<endl; 
  59.     cout <<"sizeof(A):"<<sizeof(A)<<endl; 
  60.     cout <<"sizeof(A1):"<<sizeof(A1)<<endl; 
  61.     cout <<"sizeof(A2):"<<sizeof(A2)<<endl; 
  62.     cout <<"sizeof(B):"<<sizeof(B)<<endl; 
  63.     cout <<"sizeof(C):"<<sizeof(C)<<endl; 
  64.     cout <<"sizeof(D):"<<sizeof(D)<<endl;  
  65.     getc(stdin); 
  66.     return 0; 

 

(s_a_n_)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201307/16686.html]
本文出处:CSDN博客 作者:s_a_n_ 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
相关文章
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容