IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> More Effective C++笔记(二) -> 正文阅读

[C++知识库]More Effective C++笔记(二)

三、异常

条款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完成其所应该完成的所有事。

如果exceptiondestructor内抛出,而且没有在当地被捕获,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. 如果同时提供某个操作符的复合形式和独身形式,便允许你的客户在效率与便利性之间做取舍。
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:10:21  更:2021-08-21 15:12:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年6日历 -2024/6/26 22:18:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码