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

2021-10-10 01:21:00 字數 958 閱讀 5363

考慮如下**

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