天天看點

《Effective C++》之條款26:盡可能延後變量定義式的出現時間

《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 &lt; 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 &lt; 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

繼續閱讀