More Effective C++ (2)
接下来的是more effective c++ 11至20条款:
11.禁止异常信息(exceptions)传递到析构函数外。
析构函数的调用情况可能有两种:(1)对象正常销毁 (2)异常传播过程中的栈展开机制-销毁。
如果在析构函数内抛出异常,它不会被析构函数捕获,它会传播到析构函数的调用端,如果调用端是因为其他异常而被
调用的,那么程序就会死掉。还有可能就是导致后面的语句无法执行,所以不能让异常传播到析构函数之外。
12.理解“抛出一个异常”与“传递一个参数”或“调用一个虚函数”间的差异。
(1)抛出的异常总会被复制(值传递或引用传递),指针不会被复制,trows ;抛出当前异常,throws type; 抛出异常的静态类型。
(2)被抛出的异常不会进行类型转换,但是可以捕获继承父类的子类型异常。
(3)处理异常的顺序为先捕获先处理,所以要把子类异常放在父类异常前面。
13.通过引用(reference)捕获异常。
通过引用捕获异常,可以解决用指针抛出异常时,如果指针为局部对象(抛出的是被销毁的垃圾),
或者抛出指针new 的堆中的对象该不该在之后删除的烦恼。
也可解决以值传递造成的二次复制的效率问题和虚函数调用的多态问题(异常复制是对静态类型的复制)。
14.审慎使用异常规格(exception specifications)。
在给出了异常规格的函数中,如果函数内不经意违反了异常规格中的异常列表,会导致程序的终止。
也可能会导致较高层次的调用者已经准备处理该异常而无法处理。也可以用“以不同类型的异常取代非预期的异常”解决这个问题。
15.了解异常处理的系统开销。
异常的使用成本是挺高的,请将对try语句块和异常规格的使用限制于非用不可的地点,并且在真正异常的情况下才抛出异常。
16.谨记80-20法则
一个程序80%的资源用于20%的代码的身上。80%的内存被大约20%的代码使用,80%的执行时间花在大约20%的代码身上。
当你需要找出问题的瓶颈所在,最好的是找到那关键的20%的代码,可以借助某个程序分析器来分析,知道语句被执行或函数
调用的频繁度也可以给你一些启示。
17.考虑使用lazy evaluation。
这个法则简而言之就是将非必要的大量的复杂的计算在等到真的要使用的时候才去计算获得,可以提高效率。
不过,真的需要无法避免的大量运算的话,那也是要付出相应的代价的呀。
18.分期摊还预期的计算成本。
这个条款与上一个相对应的,这个条款相当于先预分配需要的内存,或预记录频繁使用的数据,用空间来换取时间。
19.了解临时对象的来源。
临时对象并不是局部对象,它不会在你的源码里出现。
临时对象产生有两种可能:(1)当隐式类型转换。 (2)函数返回对象时候。
只有当以值传递或常量引用传递参数时才会发生隐式类型转换,非常量引用对象参数传递不会发生隐式转换。
要注意避免隐式类型转换,做好返回值的优化。
20.协助完成“返回值优化RVO”。
可以通过内联函数进行返回值的优化,这样可以消除返回的局部对象和临时对象。
未完待续~
More Effective C++ (2)的更多相关文章
- Effective前端2:优化html标签
div { float: left; } .keyboard > div + div { margin-left: 8px; } --> div{display:table-cell;ve ...
- Effective java笔记(二),所有对象的通用方法
Object类的所有非final方法(equals.hashCode.toString.clone.finalize)都要遵守通用约定(general contract),否则其它依赖于这些约定的类( ...
- 《Effective java》-----读书笔记
2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己!预计在2016年要看12本书,主要涉及java基础.Spring研究.java并 ...
- 《Effective Java》学习笔记——积累和激励
从一个实际案例说起 国庆长假前一个礼拜,老大给我分配了这么一个bug,就是打印出来的报表数量为整数的,有的带小数位,有的不带,毫无规律. 根据短短的两个多月的工作经验以及猜测,最终把范围缩小到以下这段 ...
- Effective前端5:减少前端代码耦合
什么是代码耦合?代码耦合的表现是改了一点毛发而牵动了全身,或者是想要改点东西,需要在一堆代码里面找半天.由于前端需要组织js/css/html,耦合的问题可能会更加明显,下面按照耦合的情况分别说明: ...
- Effective前端4:尽可能地使用伪元素
伪元素是一个好东西,但是很多人都没怎么用,因为他们觉得伪元素太诡异了.其实使用伪元素有很多好处,最大的好处是它可以简化页面的html标签,同时用起来也很方便,善于使用伪元素可以让你的页面更加地简洁优雅 ...
- Effective前端3:用CSS画一个三角形
p { text-indent: 2em } .triangle-container p { text-indent: 0 } img { margin: 15px 0 } 三角形的场景很常见,打开一 ...
- Effective前端1:能使用html/css解决的问题就不要使用JS
div{display:table-cell;vertical-align:middle}#crayon-theme-info .content *{float:left}#crayon-theme- ...
- Effective Java笔记一 创建和销毁对象
Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...
- effective java 读后感
think in java , effective java 这两本书一直都在java的生态圈中经久不衰.本来想着先翻过 think in java 这本大山,但是读到一半就放弃了.过长的篇幅,让 ...
随机推荐
- 在keil 4中添加stc系列芯片的方法--【sky原创】
在keil 4中添加stc系列芯片的方法: 1.从官网下载uv3.cdb的文件网址是:http://www.stcmcu.com/ 2.下载好后把uv3.cdb文件改成STC.cdb:3. 然后将[S ...
- [转]Dynamics AX and Generic collections of .Net
转自:http://blogs.msdn.com/b/emeadaxsupport/archive/2009/04/23/dynamics-ax-and-generic-collections-of- ...
- C#中的托管和非托管
注意!先看左上角声明!我不想误人子弟!但我不怕思考.没有思考就没有错误,互相学习,共同进步! 百度中的“专业人士”回答中出现了这句话(不知道是不是专业人士啊 百度说的)“1.是指托管代码,托管代码(M ...
- Jetty 嵌入式开发(实例)
我尝试了jetty几个版本,类的使用有些差异,在此记录下jettyVersion = 9.0.2.v20130417 的部分实例 maven 依赖及配置: <properties> < ...
- java 面试每日一题7
题目:判断101-200之间有多少个素数,并输出所有素数. 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数. public cla ...
- 关闭用miniUI打开的窗口
miniUI打开的窗口用window.close关闭无效, 应该用window.CloseOwnerWindow();
- YTU 2989: 顺序表基本运算(线性表)
2989: 顺序表基本运算(线性表) 时间限制: 1 Sec 内存限制: 128 MB 提交: 1 解决: 1 题目描述 编写一个程序,实现顺序表的各种基本运算(假设顺序表的元素类型为char), ...
- c# 服务端
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 越狱后如何添加cydia源及cydia源大全
http://jingyan.baidu.com/article/6c67b1d6cc53fe2787bb1e06.html 软件游戏能PJ,插件其实也一样,所以有些源里面就包含了大量的PJ插件~ a ...
- C# .ToString() 格式化
c# ToString() 格式化字符串 格式化数值:有时,我们可能需要将数值以一定的格式来呈现,就需要对数值进行格式化.我们使用格式字符串指定格式.格式字符串采用以下形式:Axx,其中 A 为格式 ...