断断续续读完这本书,花了接近两年时间,做游戏之前开始读,公司的项目做的差不多了,才读完第一遍。刚进去的时候是新人,转眼成了老鸟。
初读这本书的缘由,只是逆向的时候职业习惯对于C系语言地址+偏移的敏感,不解类的构造和传统的struct在内存布局上的区别和暗中手脚。读完之后,ADT,布局,虚函数表,临时对象,模板绑定,运行期识别等实现方式了然于胸。
书的上半部分已经解了我的惑,阐述的内容集中于C++之于C的内存布局和编译器在强类型语法上的支持及实现手法,表现于vptr,virtual public之实现,重在编译和链接期。
下半部分对new/placement new,全局对象预分配,临时对象的生成时机,EH, RTTI, type_info,type_id,以及dynamic_cast之于引用和指针都做了独到的讲解,重在运行期的数据结构组织查询方式。
全书每一个测试都贯穿了执行效率和代码复杂度上代价互换的思考,到后期的一条测试主线甚至加进了各家编译器之于不同应用平台的特化性/效率取舍,受益匪浅。
以下是感悟了:
C++之尤雅 在于有效解决了函数名重用的问题 vtable的实际作用一方面在于解决了无数的if elseif,另一方面避免了系列函数名之累赘。
然而局限也在源于此,无论vtable也好,EH也好,RTTI也好,都是在编译期硬编码了某些地址或者执行期依赖的结构信息,在视野扩展到操作系统的跨进程环境下,不同进程内虚拟地址就无法共享了。
回过头来看 ,C++编译器上的很多东西,MFC也有一些蹩脚实现。书的最后几句话讲了COM相关的东西,如COM当初开发组的leader所言,微软之所以要做COM,初衷只是解决进程间通信的问题。
最后抄一段代码来结束这半年的开发和学习生活。
#include "stdafx.h"
#include <iostream>
#include <typeinfo>
using namespace std;
class B
{
};
class D :public B
{
};
int _tmain(int argc, _TCHAR* argv[])
{
B *pb = new B;
D *pd = new D;
cout <<”pb’s type name = ” << typeid(pb).name() << endl;
cout <<”pd’s type name = ” << typeid(pd).name() << endl;
cout <<”pb’s type rawname = ” << typeid(pb).raw_name() << endl;
cout <<”pd’s type rawname = ” << typeid(pd).raw_name() << endl;
system(”pause”);
return 0;
}


分享到做啥
分享到收客
