Effective C++ --5 实现
上一部分 Effective C++ --4 设计与声明
26、尽可能延后变量定义式的出现时间
(1)这样可以增加程序的清晰度并改善程序效率。如定义变量后还未使用遇到return或者抛出异常,这样未使用却增加了调用构造析构函数的成本。
27、尽量少做转型动作
(1)使用c++新式转型,而不要是用旧式转性。有四种新式转型:const_cast<T>()、dynamic_cast<T>()、reinterpret_cast<T>()和static_cast<T>()。const_cast将对象常量性转型;dynamic_cast执行安全向下转型;reinterpret_cast执行低级转型;static_cast强迫隐式转型。
(2)尽量避免转型,特别是在注重效率的代码中避免dynamic_cast。
(3)如果转型是必要的,试着将它隐藏于某个函数背后。客户随后可以调用该函数,而不需将转型放进他们自己的代码内。
28、避免返回handles指向对象内部
(1)handles(号码牌,用来取得某个对象),reference、指针和迭代器都是,而返回一个代表对象内部数据的handle,但会降低对象封装性。
(2)避免返回handles指向对象内部。遵守这个条款可以增加封装性,帮助const成员函数的行为像个const,并将发生虚掉号码牌的可能性降低。
29、为异常安全而努力是值得的
(1)异常安全函数即使发生异常也不会泄露资源或允许任何数据结构败坏。可以提供的保证分为三种:基本承诺、强烈保证和不抛掷保证。基本保证,保证异常被抛出后所有对象都处于前后一致的状态,但是现实状态不能保证;强烈保证,如果异常抛出,程序状态不改变,如果成功,则完全成功,如果失败就回到调用函数之前的状态;不抛掷异常,总能完成原来承诺的功能。
(2)强烈保证,往往能够以copy-and-swap实现出来,但是并非对所有函数都可实现或者具备现实意义。Copy-and-swap原则:为打算修改的对象(原件)做出一份副本,然后在那份副本上做一切必要修改,若有任何修改动作抛出异常,原对象仍然保持为改变状态;待所有改变都成功后,再将修改过的那个副本和原对象在一个不抛出异常的操作中置换。
(3)函数提供的异常安全保证通常最高只等于其调用之各个函数的异常安全保证中的最弱者。
30、透彻理解inlining的里里外外
(1)将大多数inline限制在小型、被频繁调用的函数身上。
(2)不要太热衷inline函数,inline函数是对每个函数都以函数本体替换之,会造成代码膨胀,也会导致额外的换页行为,降低指令高速缓存装置的击中率,以及伴随而来的效率损失。
(3)inline只是对编译器的一个申请,不是强制命令。这项申请可以隐喻也可以明确提出。如果成员函数或者friend函数定义于class内,则被隐喻为inline;template的具现化与inlining无关,如果不是具现的每个函数都是inline,则应避免将template声明为inline;大部分编译器拒绝将太过复杂的函数inline,对所有对virtual函数的调用也都会使inlining落空。
31、将文件间的编译依存关系降至最低
(1)支持“编译依存性最小化”的一般构想是:相依于声明式,不要相依于定义式。基于此构想的两个手段是Handle classes和interface classes。
(2)pimpl idiom手法(pimpl -- pointer to implementation),将所有“隶属对象的数据”从原对象放进另一个对象,然后赋予对象一个指针,指向那个所谓的实现对象。
(3)程序库头文件应该以“完全且仅有声明式”的形式存在,不管有无template都适用。
Effective C++ --5 实现相关推荐
- Effective C++ 50条款
Effective C++ 50条款 条款 1:尽量用 const 和 inline 而不用#define--尽量用编译器而不用预处理 #define max(a,b) ((a) > (b) ? ...
- [.NET] 《Effective C#》快速笔记 - C# 中的动态编程
<Effective C#>快速笔记 - C# 中的动态编程 静态类型和动态类型各有所长,静态类型能够让编译器帮你找出更多的错误,因为编译器能够在编译时进行大部分的检查工作.C# 是一种静 ...
- Effective STL 50条有效使用STL的经验笔记
Scott Meyers大师Effective三部曲:Effective C++.More Effective C++.Effective STL,这三本书出版已很多年,后来又出版了Effective ...
- 《Effective C++》第8章 定制new和delete-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- VirtualBox: Effective UID is not root
为什么80%的码农都做不了架构师?>>> 桌面上运行virtualbox出错: The virtual machine 'xp' has terminated unexpect ...
- Effective Java:对于全部对象都通用的方法
前言: 读这本书第1条规则的时候就感觉到这是一本非常好的书.可以把我们的Java功底提升一个档次,我还是比較推荐的.这里我主要就关于覆盖equals.hashCode和toString方法来做一个笔记 ...
- 第 3 次读 Effective Java,这 58 个技巧最值!
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:Dong GuoChao <Effective ...
- Effective C++ 类与函数设计和申明
Effective C++ 类与函数的设计和申明 在看<Effective C++>这本书的过程中,我无数次的发出感叹,这他妈写得太好了,句句一针见血,直接说到点上.所以决定把这本书的内容 ...
- 量化网络训练--Towards Effective Low-bitwidth Convolutional Neural Networks
Towards Effective Low-bitwidth Convolutional Neural Networks CVPR2018 https://github.com/nowgood/Qua ...
- 卫星图像分割--Effective Use of Dilated Convolutions for Segmenting Small Object Instances
Effective Use of Dilated Convolutions for Segmenting Small Object Instances in Remote Sensing Imager ...
最新文章
- 你不知道的windows7 技巧大全【3】
- swift4.0 try 的强大
- c++ auto 关键字
- php form提交跳转,form表单页面跳转方式提交练习
- 机器学习 K-means算法_0(Matlab实现)
- CodeForces - 1350D Orac and Medians(思维)
- python父进程调用子进程_Python2.7下,调用subprocess启动子进程,读取子进程标准输出若干问题...
- 去除select框的默认样式 (包括下拉尖括号)
- LeetCode 672. 灯泡开关 Ⅱ(枚举)
- html加载js那些事
- ImageView设置边框的两种方式
- STM32封装库下载
- oracle 11g grid下载地址
- ARINC429基础知识
- 我的海淀驾校考驾照之路
- oj刷题 Problem J: 软件工程
- 如何使用 DOI 快速找到论文的全文下载网址
- Java程序员校招蚂蚁金服,中科创达java面试题
- 懈寄生---走出软件作坊:三五个人十来条枪 如何成为开发正规军(十四)[转]...
- Status Ruby on Rails in China - Presentation Transcript