C/C++ 迴圈內還是迴圈外定義變數更好?
阿新 • • 發佈:2018-11-19
問:
// 方法 A:
Widget w;
for (int i = 0; i < n; ++i) {
w = 取決於 i 的某個值;
}
// 方法 B:
for (int i = 0; i < n; ++i) {
Widget w(取決於 i 的某個值);
}
Effective C++ 條款 26 有一段話大概是:當一個賦值成本低於一組構造+析構成本,定義在迴圈外(即A)比較高效,否則定義在迴圈內(即B)比較好。
我的問題是:哪些情況 賦值成本低於一組構造+析構成本?
答:
我覺得這個更應該思考兩種情況下,變數的作用域,這個更為關鍵。A情況,w的生存週期會在迴圈外繼續存在,而B不會,不要過早的考慮優化的問題,現在的編譯器比你想象的還要聰明。
而對於C++來說,更崇尚RAII(Resource Acquisition Is Initialization),當你要使用時,就直接再宣告定義。比如在A情況下,如果我在賦值w前有一段是檢測邏輯,如果不滿足,我就直接丟擲異常,那麼你就需要承擔構造w的代價,即使它沒有用到,如下所示:
Widget w;
for (int i = 0; i < n; ++i) {
if(some condition)
{
throw std::exception("haha");
}
w = 取決於 i 的某個值;
}
然而,對於在使用時再直接宣告並定義就不會有這樣的問題:
for (int i = 0; i < n; ++i) {
if(some condition)
{
throw std::exception("haha");
}
Widget w(i);
}
這樣,即使丟擲異常,也不會承擔構造無謂的構造w的程式碼。
所以,在編寫C++程式碼時,應該忘記C89的先宣告,後面再來定義的做法,而是考慮RAII。
原文連結:迴圈內還是迴圈外定義變數? - 藍色的回答 - 知乎 https://www.zhihu.com/question/36125544/answer/66031885