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

2021-08-28 17:01:32 字數 840 閱讀 7080

問:

// 方法 a:

widget w;

for (int i = 0; i < n; ++i)

// 方法 b:

for (int i = 0; i < n; ++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)

w = 取決於 i 的某個值;

}

然而,對於在使用時再直接宣告並定義就不會有這樣的問題:

for (int i = 0; i < n; ++i)  

widget w(i);

}

這樣,即使丟擲異常,也不會承擔構造無謂的構造w的**。

所以,在編寫c++**時,應該忘記c89的先宣告,後面再來定義的做法,而是考慮raii。

python迴圈內if迴圈外else

迴圈內if迴圈外else 必須搭配 break 使用 其含義為 若在迴圈內所有值都不符合if條件,則只執行else語句。若在迴圈內有值都符合if條件,則只執行if語句。若不使用break則else語句永遠會執行。滿足條件for i in range 5 if i 3 print 我是3 else p...

Java中for迴圈巢狀的內迴圈和外迴圈

關於for迴圈巢狀作如下解釋 首先內層迴圈屬於外層迴圈迴圈體的一部分,當迴圈體執行完以後外層迴圈才進入第二次迴圈,此過程中內層迴圈需要執行符合條件的完整迴圈。外迴圈控制行數,內迴圈控制每一行的個數 下面以氣泡排序為例說明 public class test 共4輪排序,每輪都是把最大的元素排在後面 ...

for 迴圈裡面定義變數

from 不同的作用域內可以使用相同的變數名,優先使用小範圍的作用域。作用域 全域性段 函式段 塊 1.全域性段定義變數a,main函式中再定義a,那麼main中函式中定義的a,看下面例子 2.塊,由花括號 包含的區域。比如if分支體,for,while迴圈體中定義的變數,其作用域是花括號內。例 i...