《Effective C++》
條款26:盡可能延後變量定義式的出現時間
隻要你定義了一個變量而其類型帶有一個構造函數和析構函數,那麼當程式的控制流到達這個變量定義式時,你便得承受構造成本;當這個變量離開作用域時,你便得承受析構成本。即使這個變量最終并未被使用,仍需耗費這些成本,是以你應該盡量避免這種情形。
對于“盡可能延後”的了解:
不隻應該延後變量多的定義,直到非得使用該變量的前一刻為止,甚至應該嘗試延後這份定義直到能夠給它初始實參為止。如果這樣,不僅能夠避免構造(析構)非必要對象,還可以避免無意義的default構造行為。更深一層說,以“具明顯意義之初值”将變量初始化,還可以附帶說明變量的目的。
在循環中如何選擇呢?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<code>//方法A:定義于循環外</code>
<code>Widget w;</code>
<code>for</code><code>(</code><code>int</code> <code>i = 0;i < n ; i++)</code>
<code>{</code>
<code> </code><code>w = 取決于i的某個值;</code>
<code> </code><code>...</code>
<code>}</code>
<code>//方法B:定義于循環内</code>
<code>for</code><code>(</code><code>int</code> <code>i = 0 ; i < n ;i++)</code>
<code> </code><code>Widget w(取決于i的某個值);</code>
分析:
做法A:1個構造函數 + 1個析構函數 + n個指派操作
做法B:n個構造函數 + n個析構函數
如果classes的一個指派成本低于一組構造+析構成本,做法A大體而言比較高效。尤其當n值很大的時候。否則做法B或許較好。
此外,做法A造成名稱w的作用域比做法B更大,有時那對程式的可了解性和易維護性造成沖突。是以除非(1)你知道指派成本比“構造+析構”成本低;(2)你正在處理代碼中效率高度敏感的部分。否則你應該選擇做法B。
總結:
盡可能延後變量定義式的出現。這樣做可增加程式的清晰度并改善程式效率。
本文轉自313119992 51CTO部落格,原文連結:http://blog.51cto.com/qiaopeng688/1870423