C 盡可能延後變數定義式的出現時間

2021-08-17 09:05:13 字數 1072 閱讀 3529

20180315 c++ 盡可能延後變數定義式的出現時間

只要定義了變數,其型別就帶有乙個建構函式、乙個析構函式。當程式的控制流到達這個變數定義式時,就得承受構造成本,當變數離開其作用域時,就得承受析構成本。即使這個變數沒被使用,仍需耗費這些成本,所以要避免這種情形。

eg:計算密碼的加密版本後退出的程式,前提是密碼夠長,若加密太短,函式會丟出異常,型別為logic_error。

//這個函式過早定義變數「encrypted」

std::string encryptpassword(const std::string& password)

...           //必要的動作,使得能將乙個加密後的密碼

//置入變數encrypted內

return  encrypted;

}最好的解決方法是以password作為encrypted的初值,跳過毫無意義的default構造過程:

//終於,這是定義並初始化encrypted的最佳做法

std::string encryptpassword(const std::string& password)

這就是本文所說的 "盡可能延後"  的真正意義。不只要延後變數的定義,直到非得使用該變數的前一刻為止,甚至應該嘗試延後這份定義直到能夠給他初值實參為止。若如此,不僅能避免構造與析構非必要物件,還可以避免無意義的預設構造行為。更進一步說,以「明顯意義的初值」將變數初始化,還可以附帶說明變數的目的。

但在迴圈中使用的變數 應該怎樣賦值呢。

//方法a,定義於迴圈外

widget w;

for(int i = 0;i < n,++i)

//方法b,定義於迴圈內

for(int i = 0;i < n,++i)

若類中的乙個賦值成本低於一組構造+析構成本,做法a大體而言比較高效。尤其當n值很大的時候。否則做法b或許更好。此外做法a造成名稱w的作用域(覆蓋整個迴圈)比做法b更大,有時那對程式的可理解性和易維護性造成衝突。因此,除非:

1、你知道賦值成本比「構造+析構」成本低;

2、你正在處理**中效率高度敏感(performance-sensitive)的部分,否則你應該使用做法b。

條款26 盡可能延後變數定義式的出現時間

條款26 盡可能延後變數定義式的出現時間 postpone variable definitions as long as possible.內容 由於定義乙個類變數時,你就必須承擔起構造和析構的負擔.所以我們要儘量減少定義一些我們不用的物件,估計你現在對這條約束很不在意,我不用它為啥要定義它,我定...

條款26 盡可能延後變數定義式的出現時間

結論1 盡可能延後變數定義式的出現,這樣做可增加程式的清晰度並改善程式效率。應該延後變數的定義,直到使用該變數的前一刻為止,甚至應該嘗試延後定義變數直到能夠給它初值實參為止。這樣不僅能夠避免構造 和析構 非必要物件,還可以避免無意義的default構造行為。當變數應用於迴圈時,有兩個一般性結構 wi...

條款25 盡可能延後變數定義式的出現時間

只要你定義了乙個變數,而型別帶有乙個建構函式和乙個析構函式,你就得忍受構造成本與析構成本。或許你認為你不可能定義乙個不會使用的變數,但是請看下面的 std stringencryptpassword conststd string password returnencrypted 物件encrypt...