c++对象模型研究7:站在对象模型的顶端
2016-06-21 14:44
239 查看
template
在C++发明阶段,C++之父Stroustrup和贝尔实验室的C++小组对原先的宏方法进行了修订,对其进行了简化并将它从预处理范围移入了编译器。这种新的代码替换装置被称为模板,而且它变现了完全不同的代码重用方法:模板对源代码重用,而不是通过继承和组合重用对象代码。当用户使用模板时,参数由编译器来替换,这非常像原来的宏方法,却更清晰,更容易使用。未使用的template member function不应该被实例化。
对于template的错误检查,只有在实例化操作时才会进行类型类型检查,而所有的语汇(lexing)错误和解析(parsing)错误都会在处理template声明的过程中被表示出来。也就是用到了语法分析器。
在目前的编译器中,面对一个template声明,在它被一组实际参数实例化之前,只能施以有限的错误检查。
template中的名称决议法,分为 scope of the template definition 和 scope of the template instantiation.
template之中,对于一个nonmember的决议结果,是根据这个name的使用是否与“用以实例化该template的参数类型”有关而决定。如果互不相关,则使用“scope of the template declaration”来决定name,否则以“scope of the template instantiation”来决定name。
函数的决议结果,只和函数的原型有关,和函数的返回值没有关系。
对于member function的实例化行为,编译器设计者需要考虑以下3种问题:
1.编译器如何找打函数的定义? --> 答案是产生template program text file, 有点类似header
2.编译器如何能够只实例化程序中用到的member function? --> 解法方法之一,是忽略此项要求,只要class的object被实例化,就全部产生出来;另一个解决方法是模拟链接操作,检测看看哪个函数真正需要,然后只为他们产生实例
3.编译器如何组织member definition在多个 .o文件中被实例化? -->方法是产生多个实例,但只在链接器中保存一个。
对于member function,每个member function的地址都被放在active classes的virtual table中。
如果virtual table被产生出来,每个virtual function 都必须被实例化。
异常处理
欲支持exception handling,编译器的主要工作是找到catch子句,以处理被抛出来的exception。
执行期类型识别
dynamic_cast运算符可以在执行期决定真正的类型。如果downcast是安全的,也就是说base type pointer指向一个derived class object。这个运算符会传回被适当转换过的指针。
如果downcast是不安全的,这个运算符会传回0。
dynamic_cast的成本是编译时会产生一个类型描述器。
执行期对一个class指针施以dynamic_cast运算符,会返回true或false,true指的是返回真正的地址,false表示没有指向任何对象。
dynamic_cast运算符也适用于reference。
若将一个reference设为0,会引起一个临时对象被产生出来,该临时对象的初值为0,这个reference然后被设定成该临时对象的别名。
如果真正参考到derived class,downcast会继续执行程序,反之,会跑出一个bad_cast exception操作。
typeid运算符
typeid运算符传回一个const reference。类型为type_info.
RTT1只适合于多态类,但是typeid同时也适用于内建类型。 如typeid(double) 会传回一个 const type_info&。这个时候type_info object是静态取得,而非执行期取得。
效率、弹性
传统的C++对象模型提供有效率的执行期支持。这份效率,再加上与C之间的兼容性,造成了C++的广泛被接受度。然而,在某些领域方面,像是动态共享函数库、共享内存、以及分布式对象方面,这个对象模型的弹性还是不够。ps:如果你对于COM感兴趣,推荐两本理想的书籍:
《Essential COM》
《Inside COM》
阅读顺序《Essential COM》一二章->《Inside COM》
参考:
《深度探索C++对象模型》
http://blog.csdn.net/zone_programming/article/details/50412823
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- myTemplate模板引擎
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解