條款26:盡可能延後變數定義式的出現時間
(postpone variable definitions as long as possible.)
內容:由於定義乙個類變數時,你就必須承擔起構造和析構的負擔.所以我們要儘量減少定義一些我們不用的物件,
估計你現在對這條約束很不在意,我不用它為啥要定義它,我定義物件變數後肯定我會用它的嘛,呵呵,話不要說
的太早有些時候,你的"不留心"會"出賣"你做出的這個承諾.
比如下面這個例子,你需要加密密碼,如果密碼太短,丟擲異常,否則返回加密後的版本:
std::string encryptpassword(const std::string& password)
... //開始加密
return encrypted;
}噠噠噠噠,問題出來了,這裡的密碼長度要是太多,那麼丟擲異常以後,該函式呼叫終止,而我們所定義的encrypted
變數沒有使用就開始析構了,浪費了我們辛辛苦苦構造出來它,如何改正呢?這個問題不大,我們延後它的定義式不就行
了麼,**修改如下:
std::string encryptpassword(const std::string& password)
string encrypted;
... //開始加密
return encrypted;
}問題解決!咦,貌似這裡有乙個小暇疵:encrypted的定義式表明它將呼叫default建構函式,而我們在大多數情況下需
要立即給新定義變數賦初值(條款4),這種"賦值構造"比起"先構造在賦值"可以有效的提高程式執行效率,所以這裡我們就提出
乙個約束:盡量延後變數的定義,直到非得使用該變數的前一刻為止,甚至應該嘗試延後這份定義直到能夠給它初值實參為
止.這樣的話就不僅能夠避免構造(和析構)非必要物件,還可以避免無意義的default構造行為.
如果在迴圈語句中定義變數,我們將需要考慮到它的構造(析構)成本與賦值成本所承受成本的大小比較問題,看下面這
兩種形式:
//a :變數定義於迴圈外
widget w;
for(int i = 0; i < n; i++)
//b:變數定義於迴圈內
for(int i = 0; i < n; i++)
兩種形式的成本如下:
a: 1個建構函式 + 1個析構函式 + n個賦值函式
b: n個建構函式 + n個析構函式
我們開始比較:如果widget的構造析構成本比賦值成本要高的話,無疑a的做法總體效率要高;反之則b的做法效率高.
請記住:
◆ 盡可能延後變數定義式的出現.這樣做可增加程式的清晰度並改善程式效率.
條款26 盡可能延後變數定義式的出現時間
結論1 盡可能延後變數定義式的出現,這樣做可增加程式的清晰度並改善程式效率。應該延後變數的定義,直到使用該變數的前一刻為止,甚至應該嘗試延後定義變數直到能夠給它初值實參為止。這樣不僅能夠避免構造 和析構 非必要物件,還可以避免無意義的default構造行為。當變數應用於迴圈時,有兩個一般性結構 wi...
條款26 盡可能延後變數定義式的出現時間
主要是效率上的考慮。考慮下述 void encrypt std string s std string encryptpassword const std string password 具體獲取密碼加密操作 encrypted password encrypt encrypted return e...
條款26 盡可能延後變數定義式的出現時間
主要是效率上的考慮。考慮下述 void encrypt std string s std string encryptpassword const std string password 具體獲取密碼加密操作 encrypted password encrypt encrypted return e...