三、异常

条款9:利用destructor避免泄露资源

把资源封装在对象内,通常可以在exception出现时避免资源泄露

条款10:在构造函数内阻止资源泄露

C++仅仅能删除被完全构造的对象(fully constructed objects),只有一个对象的构造函数完全运行完毕,这个对象才被完全地构造。C++拒绝为没有完成构造操作的对象调用析构函数。

在构造函数中可以使用try catch throw捕获所有的异常。更好的解决方法是通过智能指针的方式。

如果你用对应的std::unique_ptr或者shared_ptr对象替代指针成员变量,就可以防止构造函数在存在异常时发生资源泄漏,你也不用手工在析构函数中释放资源,并且你还能像以前使用非const指针一样使用const指针,给其赋值。

条款11:禁止异常exception流出析构函数destructor之外

1.可以避免terminate函数在exception传过程的栈展开机制中被调用。

如果控制权基于exception的因素离开destructor,而此时正有另一个exception处于作用状态,C++会调用terminate函数结束程序

2.可以协助确保destructor完成其所应该完成的所有事。

如果exception从destructor内抛出,而且没有在当地被捕获,destructor便是执行不全,仅执行到异常抛出那一点。

条款12:了解“抛出一个exception”与传递一个参数或调用一个虚函数之间的差异

函数参数和exception的传递方式有三种:by value,by reference,by pointer

  1. 抛出一个exception,不管用什么传递方式,这个exception总是会被复制,防止exception离开其生存空间后被销毁导致传递了空的exception对象,而对于by value传递,甚至会复制两次。而参数传递则不一定会复制副本。
  2. 被抛出成为exception对象被允许的类型转换动作只有两种:继承架构中的类转换,即针对base class exception而编写的catch子句可以处理类型为derived class的exceptions。第二种是允许从一个类型化指针(typed pointer)转变成无类型指针(untypedpointer),所以带有 const void* 指针的 catch 子句能捕获任何类型的指针类型异常。
  3. catch 子句匹配顺序总是取决于它们在程序中出现的顺序,所以不要让处理派生类异常的 catch 子句位于处理基类异常的 catch 子句后面。而调用虚函数时,被选中执行的是那个与对象最吻合的函数

条款13:以by reference的方式捕捉exception

catch by reference可以避免by pointer的对象删除问题,也可以避开by value的切割问题(派生类exception 对象被捕捉并被视为基类异常者,将失去派生成分,切割了子类可能需要的虚函数功能)。

条款14:明智运用exception specifications

条款15:了解异常处理的成本

四、效率

条款16:谨记80-20法则

一个程序80%的资源用域20%的代码,80%的执行时间花费在20%的代码上。

条款17:考虑使用lazy evaluation(缓式评估)

以某种方式撰写classes,使它们延缓计算,直到那些运算结果刻不容缓被迫切需要为止。可应用于:Reference Counting(引用计数)来避免非必要的对象复制、区分 operator[] 的读和写动作来做不同的事情、Lazy Fetching(缓式取出)来避免非必要的数据库读取动作、Lazy Expression Evaluation(表达式缓评估)来避免非必要的数值计算动作。

条款18:分期摊还预期的计算成本

和上一条款相反,要求超前进度的做要求以外的更多工作。

Over-eager evaluation:如果你预期你的程序常常会用到某个计算,你可以设计一份数据结构一边能够有效率的处理需求。

例如常用的caching缓存技术。

第二种是prefetching预先取出,比如stl种vecctor动态内存的分配,当需要扩张时,每次分配2倍内存。

条款19:了解临时对象的来源

  1. reference to const参数会导致有一个临时对象被产生出来绑定至该参数上。
  2. 任何时候只要你看到函数返回一个对象,就会产生临时对象(并于稍后销毁)。

条款20:协助完成返回值优化(RVO)

有时候某些操作或者函数必然要返回对象,就要产生临时对象,这无法避免,比如operator*,如果一定得以by-value方式返回对象,可以以一种特殊写法撰写函数,让他返回constructor arguments以取代对象。

此特殊的优化行为——利用函数的return点消除一个局部临时对象。

称为Return value optimization。

条款21:利用重载技术避免隐式类型转换

如下:

注意:每个“重载操作符”必须获得至少一个用户自定义类信息的自变量。所以最后一个重载操作是错的。

条款22:考虑以操作符复合形式(op=)取代其独身形式(op)

  1. 一般而言,符合操作符比其对应的独身版本效率高,因为独身版本通常必须返回一个新对象,而我们必须因此承担一个临时对象的构造和析构成本。
  2. 如果同时提供某个操作符的复合形式和独身形式,便允许你的客户在效率与便利性之间做取舍。

More Effective C++笔记(二)的更多相关文章

  1. Effective C++ 笔记二 构造/析构/赋值运算

    条款05:了解C++默默编写并调用哪些函数 编译器默认声明一个default构造函数.一个copy构造函数.一个copy assignment操作符和一个析构函数.这些函数都是public且inlin ...

  2. Effective C++笔记(二):构造/析构/赋值运算

    参考:http://www.cnblogs.com/ronny/p/3740926.html 条款05:了解C++默默编写并调用哪些函数 如果自定义一个空类的话,会自动生成默认构造函数.拷贝构造函数. ...

  3. [Effective JavaScript 笔记]第3章:使用函数--个人总结

    前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...

  4. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  5. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  6. jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}

    笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...

  7. Mastering Web Application Development with AngularJS 读书笔记(二)

    第一章笔记 (二) 一.scopes的层级和事件系统(the eventing system) 在层级中管理的scopes可以被用做事件总线.AngularJS 允许我们去传播已经命名的事件用一种有效 ...

  8. Python 学习笔记二

    笔记二 :print 以及基本文件操作 笔记一已取消置顶链接地址 http://www.cnblogs.com/dzzy/p/5140899.html 暑假只是快速过了一遍python ,现在起开始仔 ...

  9. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  10. webpy使用笔记(二) session/sessionid的使用

    webpy使用笔记(二) session的使用 webpy使用系列之session的使用,虽然工作中使用的是django,但是自己并不喜欢那种大而全的东西~什么都给你准备好了,自己好像一个机器人一样赶 ...

随机推荐

  1. 一款简单实用的串口通讯框架(SerialIo)

    前言 大龄程序员失业状态,前几天面试了一家与医疗设备为主的公司并录取:因该单位涉及串口通讯方面技术,自己曾做过通讯相关的一些项目,涉及Socket的较多,也使用SuperSocket做过一些项目,入职 ...

  2. vue-混入( mixin 更方便的组件功能复用方法)的使用

    前言 vue 中组件完成了样式和功能的综合复用,通过自定义指令完成了一部分功能的复用,本文总结一下混入在vue项目开发中提供的非常便利的功能复用. 正文 1.混入的分类 (1)全局混入 <div ...

  3. mysql从零开始之MySQL LIKE 子句

    MySQL LIKE 子句 我们知道在 MySQL 中使用 SQL SELECT 命令来读取数据, 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录. WHERE 子句中可以 ...

  4. 解决vue项目中遇到父组件的按钮或操作控制重新挂载子组件但是子组件却无效果的情况

    在vue项目中终会遇到需要父组件的按钮或操作控制重新挂载子组件的需求,我在新项目中就遇到这种需求.真实场景是父组件的早,中,晚三个按钮(代表三个时间段)来控制子组件的table表格列的动态加载. 子组 ...

  5. JS中变量的命名规范

    命名规范 包含数字.字母.下划线和$,但 不能以数字开头 变量名严格区分大小写 变量名不能是关键字和保留字 变量名要见名知意 如果变量名有多个单词组成,推荐使用 小驼峰命名法 命名时,尽量使用英语,如 ...

  6. 安全通信协议SSH应用与分析

    一.实验简介: 本次实验属于安全协议应用与分析系列 二 实验环境: Windows server 2003 server windows xp 做client 三.实验目的 通过该实验了解SSH服务器 ...

  7. 面试官问我MySQL调优,我真的是

    面试官:要不你来讲讲你们对MySQL是怎么调优的? 候选者:哇,这命题很大阿...我认为,对于开发者而言,对MySQL的调优重点一般是在「开发规范」.「数据库索引」又或者说解决线上慢查询上. 候选者: ...

  8. jmx_prometheus_javaagent+prometheus+alertmanager+grafana完成容器化java监控告警(二)

    一.拓扑图 二.收集数据 2.1前期准备 创建共享目录,即为了各节点都创建该目录,有两个文件,做数据共享 /home/target/prom-jvm-demo 1.下载文件 jmx_prometheu ...

  9. Jave Hbase AP

    Hbase API 类和数据模型的对应关系 HBaseAdmin 类:org.apache.hadoop.hbase.client.HBaseAdmin 作用:提供了一个接口来管理 HBase 数据库 ...

  10. C#开发BIMFACE系列47 IIS部署并加载离线数据包

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在前两篇博客<C#开发BIMFACE系列45 服务端API之创建离线数据包>与<C#开发BIMFACE系 ...