本節書摘來自異步社群出版社《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