2017-03-11 26 views
0

如果我正在經歷一個循環,說迭代的載體,以及我不想做一些項目的動作在載體中,我能做到這一點有兩種方式:迴路檢測約定

這是一個我喜歡使用:

vector<int> vec; 
void loopFunction(int toIgnore) { 
    for (size_t index = 0; index < vec.size(); index++) { 
     if (vec[index] == toIgnore) continue; 
     // do stuff 
    } 
} 

這是一個我看到的大多數人使用:

vector<int> vec; 
void loopFunction(int toIgnore) { 
    for (size_t index = 0; index < vec.size(); index++) { 
     if (vec[index] != toIgnore) { 
      // do stuff 
     } 
    } 
} 

我知道最後的結果是絕對沒有區別。但是,由於第二種方式打開一個新的範圍來執行,是否有任何區別?這兩種方法中的哪一種比另一種更受歡迎?

感謝

+0

個人而言,我儘量避免嵌入範圍限定,所以我可以使用第一個例子使用'continue',以便循環中的所有內容都處於同一水平。所有關於偏好,但。沒有性能優勢,據我所知 –

+0

我也更喜歡第一種方式來做到這一點。我不喜歡我的代碼中的嵌套作用域。但是,添加新範圍是否會增加開銷?我認爲這可能是大循環? – Everyone

回答

2

正如我的評論指出,在個人層面上,我寧願爲了防止不必要的代碼嵌套和範圍使用建立continue先執行。

除了要實現的正常代碼之外,每個代碼的唯一性能開銷是對if-statement中表達式的評估。由於它們都包含要評估的表達式,因此它們在性能上是相同的。

如果你考慮如何編譯它,對於C/C++,它直接進入彙編代碼。在那個級別上,無論你如何嵌入代碼,它都會編譯成簡單的jmpcmp命令。因此,不管實現如何,在編譯時,您將擁有相同的彙編代碼。

無論哪種方式你看它,這是一個微型微型優化,如果有的話!做你喜歡的代碼格式和樣式。

+0

感謝您的澄清。然後,我會堅持第一種格式,看起來更整齊:p – Everyone

+0

我對巨型矢量進行了性能測試,是的他們產生了類似的結果。此外,我在C#上做了測試,得到了相同的結果,所以它們確實沒有什麼區別。只是偏好 – Everyone