1. 程式人生 > >C/C++ 迴圈內還是迴圈外定義變數更好?

C/C++ 迴圈內還是迴圈外定義變數更好?

問:

// 方法 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