考慮如下**
std::string encryptpasswd
(const std::string& passwd)
// ...
return encryted;
}
上述函式中的encrypted
物件未完全使用,當encryptpasswd
丟出異常時,仍需要付出encrypted
的構造和析構成本,所以最好延後encrypted
的定義式,如下:
std::string encryptpasswd
(const std::string& passwd)
// ...
string encrypted;
return encryted;
}
但是上述**仍然不夠好,因為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:1個建構函式 + 1個析構函式
如果classes
的乙個賦值成本低於一組構造+析構函式,做法a大體而言比較高效,尤其n很大的時候,否則做法b或許比較好;
條款26 盡可能延後變數定義式的出現時間
條款26 盡可能延後變數定義式的出現時間 postpone variable definitions as long as possible.內容 由於定義乙個類變數時,你就必須承擔起構造和析構的負擔.所以我們要儘量減少定義一些我們不用的物件,估計你現在對這條約束很不在意,我不用它為啥要定義它,我定...
條款26 盡可能延後變數定義式的出現時間
結論1 盡可能延後變數定義式的出現,這樣做可增加程式的清晰度並改善程式效率。應該延後變數的定義,直到使用該變數的前一刻為止,甚至應該嘗試延後定義變數直到能夠給它初值實參為止。這樣不僅能夠避免構造 和析構 非必要物件,還可以避免無意義的default構造行為。當變數應用於迴圈時,有兩個一般性結構 wi...
條款26 盡可能延後變數定義式的出現時間
主要是效率上的考慮。考慮下述 void encrypt std string s std string encryptpassword const std string password 具體獲取密碼加密操作 encrypted password encrypt encrypted return e...