本节书摘来自异步社区出版社《C++编程规范:101条规则、准则与最佳实践》一书中的第2章,第2.5节,作者:【加】Herb Sutter , 【罗】Andrei,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.5 不要进行不成熟的劣化
摘要
放松自己,轻松编程:在所有其他事情特别是代码复杂性和可读性都相同的情况下,一些高效的设计模式和编程惯用法会从你的指尖自然流出,而且不会比悲观的替代方案更难写。这并不是不成熟的优化,而是避免不必要的劣化(pessimization)。
讨论
避免不成熟的优化并不意味着必然损害性能。所谓不成熟的劣化,指的就是编写如下这些没有必要的、可能比较低效的程序。
在可以通过引用传递的时候,却定义了通过值传递的参数(见第25条)。
在使用前缀++操作符很合适的场合,却使用后缀版本(见第28条)。
在构造函数中使用赋值操作而不是初始化列表(见第48条)。
如果减少对象的伪临时副本(尤其是在内循环中)并不影响代码的复杂性,那么这个优化就算不上是不成熟的优化。在第18条中,我们提倡尽可能将变量声明为局部的,但是又提到了一个例外情况,即有时候将变量从循环中提出来是有好处的。大多数时候,这一点也不会混淆代码的意图,相反,实际上这有助于澄清循环内部执行了哪些功能,哪些计算是不随循环变化的。当然,应该优先使用算法,而不是显式的循环(见第84条)。
构造既清晰又有效的程序有两种重要的方式:使用抽象(见第11条和第36条)和库(见第84条)。例如,使用标准库的vector、list、map、find、sort和其他设施,这些都是由世界级的专家标准化并实现的,不仅能使你的代码更加清晰,更容易理解,而且启动也经常更快。
避免不成熟的劣化在编写库的时候尤其重要。要了解库所使用的所有上下文,通常是不可能的,因此可能需要达到一种平衡,在更加倾向效率和可复用性的同时,又不能因为一小部分潜在的调用者的利益过分提高效率。其中的界限需要你来划定,但是正如第7条所说明的,更需要关注的是可伸缩性,而不是挤掉一个小小的循环。
参考文献
[Keffer95]pp.12-13 ● [Stroustrup00]§6 introduction ● [Sutter00]§6