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

2021-04-30 01:33:03 字數 1340 閱讀 2855

條款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...