Inside The C++ Object Model 读书笔记(一)

    添加时间:2013-5-25 点击量:

      本身对于C++的懂得一贯都不太深切,看到貌似很多牛人都读过这本Inside The C++ Object Model,似乎深切懂得C++必须读这本书,于是决意啃一下。到手当天看了下目次就知道这绝对是本好书。很多C++的书不知道是出于什么目标,要么不想讲清楚,要么就是讲不清楚,总之底子就没有将C++的一些机制写出来,即使写出来也有很多具有二义性,让人完全不知所措。


      好了,闲话少说。之所以C++有很多很难懂得的器材,原因之一就是C++背着我们做了太多的工作。这是我拿到这本书之后的第一反响。


      第一个解决的题目就是C++对象模型。C++对象模型毕竟是什么样子,反正我在看这本书之前完全没有概念,可能和我没学过编译道理有关,所以对于如下一些题目,就完全不知所措:



     1 class A{};
    
    2
    3 class B{
    4 public:
    5 int a;
    6 static int b;
    7 };
    8
    9 class C{
    10 public:
    11 char id;
    12 char num;
    13 int data;
    14 C();
    15 ~C();
    16 void setid();
    17 private:
    18 void funtion();
    19 };
    20
    21 class D:public C{
    22 virtual void function()=0;
    23 };
    24
    25 sizeof(A)=?
    26 sizeof(B)=?
    27 sizeof(C)=?
    28 sizeof(D)=?


      一个空类,或者空类的对象,它的大小是几许,为什么?每一个类的大小是几许,为什么?这些题目在读完第一章并接洽第三章今后便豁然开朗。


      起首对于一个空类,实际上它并不是空的,它有一个隐蔽的1byte的char,如许设计的原因是,能让如许一个类的不合对象可以或许设备在一个独一无二的地址上,可以或许区分隔来。所以sizeof(A)=1。这就是C++编译器背着我们做的动作之一,也就是所谓implicit code。法度员写的代码根蒂根基上都应当叫做explicit code, 而编译器添加进去的则称之为implicit code。


      对于后面的题目,须要描述C++对象模型,以一个Point类为例:class Point{



    public:
    
    int _x;
    int _y;

      static char _z;
      Point();

    virtual void function1();
    virtual void function2();
    };


      类中有两个int类型的成员变量,一个声明为static的char型成员变量,一个机关函数,两个需函数,如今我们来看一下其真正的对象模型布局:


      


      也就是说,真正的对象(非空)中,并不是声了然什么就有扫描,而是只包含声明的非静态成员变量,和一个指向一个Virtual table的指针。


      如许我们对对象的布局和大小就一目了然了,若类中没有声明或者持续虚函数时,那么就是对象的大小就长短静态成员变量的大小之和(这里先不推敲字节对齐的题目),若是有虚函数则对象中保存了一个指向虚函数表的指针,这个虚函数默示为了定位虚函数而设定的,而一个指针在32位的机械上占4个字节,所以如许pt对象的大小就是12个字节。而对于上方的示例,sizeof(B)=4(静态成员变量不存储在对象中),sizeof(C)=2+2+4=8(32位的机械上默认是4字节对齐),因为子类也拥有父类的成员,class D也有虚函数,是以sizeof(D)=8+4=12。


      所以说C++背着我们做了太多的工作~!不懂得编译器或者说设计的思惟,就永远被蒙在鼓里。


      

    原来,再大的房子,再大的床,没有相爱的人陪伴,都只是冰冷的物质。而如果身边有爱人陪伴,即使房子小,床小,也觉得无关紧要,因为这些物质上面有了爱的温度,成了家的元素。—— 何珞《婚房》#书摘#
    分享到: