深度探索C++对象模型读书笔记-第七章站在对象模型的尖端
Template
模板是在编译时期而非执行时期被计算的。因此其不会带来效率的降低。
1: const Point<float> &ref = 0;
该语句会实例化一个Point的float实例。该语句会被扩展为:
1: Point<float> temp(float(0));
2: const Point<float> &ref = temp;
这是因为0需要转换为对象,才能被引用.如果不能转换,该定义就是错误的.会在编译时被发现.
即一个class object的定义,不会是编译器暗中做(临时对象) 或是程序员显示的做(创建对象),都会导致template class的实例化。
C++ 彼岸准要求对于memberfunctions(成员函数),那些未使用的不应该被实例化,只有在member functions被使用的时候,才被实例化。
(但是目前的编译器并不精确遵循该要求。) 该要求主要基于以下两个原因
- 空间和时间效率的考虑。比如class中有100个member functions,而你的程序值针对某个类型使用了其中两个,针对另一个类型使用了五个,其他函数的实例化将会花费大量的时间和空间,而实际上是不需要的。
- 尚未实现的机能。并不是template实例化的所有类型都能完整支持member functions所需要的函数。如果只实例化真正用到的函数,template就可以支持那些实例化全部函数可能造成编译错误的类型。
Template中,对于一个非成员名字的决议结果,是根据这个名字的使用是否与用以实例化该template的参数类型有关而决定的。
- 如果与其实例化类型互不相关,那么就以“scope of the template declaration” 来决定name(就是定义template的程序)
- 如果与其实例化类型互有关联,那么就以“scope of the template instantiation” 来决定name(就是实例化template的程序)
1: // scope of the template definition
2: extern double foo(double);
3:
4: templte<class type>
5: class ScopeRules {
6: public:
7: void invariant() {
8: _member = foo(_val);
9: }
10: type type_dependent() {
11: return foo(_member);
12: }
13: private:
14: int _val;
15: type _member;
16: };
17:
18: // scope of the template instantiation
19: extern int foo(int)
20: // ...
21: ScopeRules<int> sr0;





异常处理
C++异常处理的三个主要的组件:
- 一个throw语句。他在程序某处发出一个exception。被抛出的exception可以是内建类型,也可以是自定义类型
- 一个或多个catch语句,每个catch语句都是一个exception handler。它用来表示该子句准备处理某种类型的exception,并且在封闭的大括号区段中提供实际的处理逻辑。
- 一个try区段。它被围绕以一系列的语句,这些语句可能会引发catch语句起作用。
当一个exception被抛出去时,控制权会从函数调用中释放出来,并寻找一个合适的catch语句。如果没有,则默认的处理程序terminate()会被调用。
当一个exception发生时,编译系统必须完成以下事情:
- 检验发生throw操作的函数。
- 决定throw操作是否发生在try区段中。
- 若是,编译系统必须吧exception type拿来和每个catch子句进行比较。
- 如果比较吻合,控制流程交给catch子句
- 如果throw的操作并不发生在try区段中,或没有一个catch子句吻合,那么系统必须
- 摧毁所有的active local objects(完成资源回收)
- 从对战中将目前的函数unwind
- 进行到堆栈的下一个函数中,重复上面2~5
关于异常的机制和原理参考:http://www.cnblogs.com/lovemdx/p/3254108.html
深度探索C++对象模型读书笔记-第七章站在对象模型的尖端的更多相关文章
- Getting Started With Hazelcast 读书笔记(第七章)
第七章 部署策略 Hazelcast具有适应性,能根据不同的架构和应用进行特定的部署配置,每个应用可以根据具体情况选择最优的配置: 数据与应用紧密结合的模式(重点,of就是这种) 胖客户端模式(最好用 ...
- Android深度探索--HAL与驱动开发----第七章读书笔记
首先创建led驱动的设备文件,可以使用cdev_init,register_chrdev_region,cdev_add等建立主设备号的设备文件.步骤如下: 1使用cdev_init初始化cdev 2 ...
- 深度探索C++对象模型读书笔记-第六章执行期语意学
在函数中,编译器会帮助将析构函数(Destructor) 安插在相应的位置.对于函数中的局部对象,会将析构函数安插在对象的每一个离开点. 例如: 1: void Function(int a) { 2 ...
- 《R语言实战》读书笔记 第七章--基本统计分析
在导入数据并且将数据进行组织和初步可视化以后,需要对数据进行分布探索和两两关系分析等.主要内容有描述性统计分析.频数表和列联表.相关系数和协方差.t检验.非参数统计. 7.1描述性统计分析 7.1.1 ...
- 《利用python进行数据分析》读书笔记--第七章 数据规整化:清理、转换、合并、重塑(三)
http://www.cnblogs.com/batteryhp/p/5046433.html 5.示例:usda食品数据库 下面是一个具体的例子,书中最重要的就是例子. #-*- encoding: ...
- #《Essential C++》读书笔记# 第七章 异常处理
基础知识 异常处理机制有两个主要成分:异常的鉴定和发出,以及异常的处理方式.通常,不论是membe function和non-member function,都有可能产生异常以及处理异常.异常出现后, ...
- 深入探索C++对象模型 读书笔记
第1章 关于对象 1.C++在布局以及存取时间上的主要的额外负担是由virtual引起的,包括: a.virtual function机制,引入vptr以及vtbl,支持一个有效率的"执行期 ...
- 《C#从现象到本质》读书笔记(七)第9章 泛型
<C#从现象到本质>读书笔记(七)第9章 泛型 泛型的三大好处:类型安全,增强性能(避免装箱和拆箱),代码复用. 泛型方法是传入的参数至少有一个类型为T(尚未制定的类型,根据微软的命名规则 ...
- 《Linux内核设计与实现》读书笔记——第五章
<Linux内核设计与实现>读书笔记--第五章 标签(空格分隔): 20135321余佳源 第五章 系统调用 操作系统中,内核提供了用户进程与内核进行交互的一组接口.这些接口让应用程序受限 ...
随机推荐
- Javascript高级程序设计--读书笔记之面向对象(一)
哈哈哈万物皆对象,终于到了js的面向对象篇. 一.属性类型 (1)数据属性 数据属性包含一个数据值的位置,在这个位置可以写入和读取数值,数据属性有四个描述器行为的特性 [[Configurable]] ...
- JSONObject.toJSONString(map)
Map<Integer, List<Integer>> map = new LinkedHashMap<>(); map.put(1,ddzCard.getOneS ...
- 升级python后yum命令出错
执行yum命令报错: yum list Loaded plugins: fastestmirror base | 3.6 kB 00:00:00 epel | 5.3 kB 00:00:00 extr ...
- PHP-组合总和
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...
- AE开发中实现Control中的各种图形工具的方法(转)
Controls中的工具基本可以分为两类: 第一类:点击工具图标或按钮后,当前axMapControl的工具即为所点击的工具命令. 前面有Controls 后面有tool的工具都可以用同一类的代码实现 ...
- node-mysql连接数据库
const mysql=require('mysql') const con=mysql.createConnection({ host:'localhost', user:'root', passw ...
- 2.java中c#中statc 静态调用不同之处、c#的静态构造函数和java中的构造代码块、静态代码块
1.java和c#静态成员调用的不同之处 static 表示静态的,也就是共享资源,它是在类加载的时候就创建了 java中 可以通过实例来调用,也可以通过类名.成员名来调用,但是一般最好使用类名. ...
- 75. InputStreamReader和OutputStreamWriter(转换流--字节流转换成字符流)
转换流: InputStreamReader 输入字节流转换成输入字符流OutputStreamWriter 输出字节流转换成输出字符流 总结:就是字节流转换成字符流,但是不能字节流转换成字节流 ...
- 获取min-max之间的随机数
private static String getRandom(int min, int max){ Integer random =(int)(min+Math.random()*(max-min+ ...
- 分治维护dp——19南昌网络赛C/cf750E
南昌网络赛,是cf的原题 第一次做到这种题,所以认真想了下,每次给一个询问[L,R],要求出这个区间里有2017子序列,但是不能有2016子序列需要删掉的最少元素个数 首先如果我们之询问一小段区间[L ...