《C++编程规范:101条规则、准则与最佳实践》——2.5 不要进行不成熟的劣化
本节书摘来自异步社区出版社《C++编程规范:101条规则、准则与最佳实践》一书中的第2章,第2.5节,作者:【加】Herb Sutter , 【罗】Andrei,更多章节内容可以访问云栖社区“异步社区”公众号查看。
摘要
放松自己,轻松编程:在所有其他事情特别是代码复杂性和可读性都相同的情况下,一些高效的设计模式和编程惯用法会从你的指尖自然流出,而且不会比悲观的替代方案更难写。这并不是不成熟的优化,而是避免不必要的劣化(pessimization)。
讨论
避免不成熟的优化并不意味着必然损害性能。所谓不成熟的劣化,指的就是编写如下这些没有必要的、可能比较低效的程序。
在可以通过引用传递的时候,却定义了通过值传递的参数(见第25条)。
在使用前缀++操作符很合适的场合,却使用后缀版本(见第28条)。
在构造函数中使用赋值操作而不是初始化列表(见第48条)。
如果减少对象的伪临时副本(尤其是在内循环中)并不影响代码的复杂性,那么这个优化就算不上是不成熟的优化。在第18条中,我们提倡尽可能将变量声明为局部的,但是又提到了一个例外情况,即有时候将变量从循环中提出来是有好处的。大多数时候,这一点也不会混淆代码的意图,相反,实际上这有助于澄清循环内部执行了哪些功能,哪些计算是不随循环变化的。当然,应该优先使用算法,而不是显式的循环(见第84条)。
构造既清晰又有效的程序有两种重要的方式:使用抽象(见第11条和第36条)和库(见第84条)。例如,使用标准库的vector、list、map、find、sort和其他设施,这些都是由世界级的专家标准化并实现的,不仅能使你的代码更加清晰,更容易理解,而且启动也经常更快。
避免不成熟的劣化在编写库的时候尤其重要。要了解库所使用的所有上下文,通常是不可能的,因此可能需要达到一种平衡,在更加倾向效率和可复用性的同时,又不能因为一小部分潜在的调用者的利益过分提高效率。其中的界限需要你来划定,但是正如第7条所说明的,更需要关注的是可伸缩性,而不是挤掉一个小小的循环。
参考文献
[Keffer95]pp.12-13 ● [Stroustrup00]§6 introduction ● [Sutter00]§6
《深入理解Android:Telephony原理剖析与最佳实践》一2.5 使用Source Insight方便阅读C/C++代码 本节书摘来自华章出版社《深入理解Android:Telephony原理剖析与最佳实践》一 书中的第2章,第2.5节,作者:杨青平,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
《C++编程规范:101条规则、准则与最佳实践》——导读 许多糟糕的编程规范都是由一些没有很好地理解语言、没有很好地理解软件开发或者试图标准化过多东西的人制定的。糟糕的编程规范会很快丧失可信度,如果程序员不喜欢或者不同意其中一些糟糕的准则,那么即使规范中有一些合理的准则,也可能被不抱幻想的程序员所忽略,这还是最好的情况,最坏的情况下,糟糕的标准可能真会被强
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- C++ wcout 输出中文
- qt实现web服务器加载vue应用进行C++和html混合编程-连载【6】-企业级系统开发实战连载系列 -技术栈(vue、element-ui、qt、c++、sqlite)
- C++中使用std::sort自定义排序规则时要注意的崩溃问题
- 《C++编程规范:101条规则、准则与最佳实践》——2.2 正确、简单和清晰第一
- 《C++编程规范:101条规则、准则与最佳实践》——2.4不要进行不成熟的优化
- 《C++编程规范:101条规则、准则与最佳实践》——导读
- 《数字图像处理与机器视觉——Visual C++与Matlab实现》——1章 Matlab图像处理编程基础
- C++ lambda表达式
- 理清gcc、libc、libstdc++的关系(libstdc++是gcc搞的,libc++是llvm搞的,他们都是C++标准库的实现)
- C++new失败的处理(如果 new 分配内存失败,默认是抛出异常的,但也可以取消异常)
- 为QML创建C++插件(下载)
- 150、【动态规划】leetcode ——96. 不同的二叉搜索树(C++版本)
- 99、【树与二叉树】leetcode ——113. 路径总和 II:回溯法两种版本(C++版本)
- C++ 基础入门 之 注释 ( // 和 /**/ )/变量 /常量 ( #define 和 const )/关键字/标识符(变量名)命名规则
- C++ 中new/delete与malloc/free详解