-
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++背着我们做了太多的工作~!不懂得编译器或者说设计的思惟,就永远被蒙在鼓里。