一、模板
二、异常处理
1) 检验throw操作的函数;
2) 决定throw操作是否发生在try区段;
3) 若是,则把异常对象的类型与每个catch子句对比(依赖RTTI机制);
4) 若吻合时,则流程控制交给catch子句中(catch子句可以处理异常或其他的资源释放或恢复等操作,也可以继续抛出原异常对象(throw;即可)或抛出新的异常对象(throw newException(););另外catch子句若用基类以值的方式而不是引用来捕获子类异常对象,则会出现截断;
5) 若throw操作不在try区段或没有找到合适的catch子句,则系统需销毁当前的局部变量对象,然后从堆栈中将当前函数弹出掉,再进入到程序堆栈中的下一个函数中,重复以上步骤2~5。直到没有找到则终止程序。
6) C++编译器支持EH(异常捕获)机制会产生执行速度和程序大小的代价。
三、执行期类型识别(RTTI)
1) 额外空间以存储类型信息,通常为一个指向某类型信息节点的指针;
2) 额外时间以决定执行期的类型。
C++利用虚表,将类相关的RTTI对象地址(即type_info对象地址)放在虚表中(一般为第一个slot),此时编译器在编译的时候设定vtpr和虚表即可,当需要向下转型时利用RTTI决定执行期类型等信息。
2. 类型安全的动态转换dynamic_cast可以确保转化合适的类型对象,若失败则返回空指针(当转化为指针类型时)或者抛出异常(当转化为引用类型时)。dynamic_cast的成本在于运行期的类型识别判断。
3. 使用typeid运算符获取对象的类型,即type_info,当然也可以通过typeid来确定是否满足某个类型,然后调用static_cast转化即可。即if(typeid(someObj) == typeid(someType) ) {someType &rf = static_cast<someType&>(someObj);}。此外RTTI不仅可用于多态类,也可以用于内置类型和非多态的用户自定义类型。
读书笔记《深度探索c++对象模型》(7) - 模板、异常处理、RTTI
原文:https://www.cnblogs.com/haomiao/p/11661071.html