2017-11-11 120 views
1

我有一段代碼,是這樣的:非平凡轉到使用(可能擊敗編譯)

f += .001f; //Only needs to be executed when loop executes at least one iteration, but does no harm if incremented without entering the loop 
while(anIndex < aVaryingBoundary) { 
    if(something) { 
     //code 
     continue; 
    } 
    //more code 
} 

我發現,使這個代碼更有效的唯一方式(通過消除的F不必要的增量)是使用goto。

if(anIndex < aVaryingBoundary) { 
    f += .001f; 

loop: 
    if(something) { 
     //code 
     if(anIndex < aVaryingBoundary) { 
      goto loop; 
     } 
     else { 
      goto loop_end; 
     } 
    } 
    //more code 
    if(anIndex < aVaryingBoundary) { 
      goto loop; 
    } 
} 
loop_end: 

即使這是一個簡單的優化,我不認爲編譯器可以很容易地檢測到這一點。編譯器執行真的不重要嗎?

+0

爲什麼你使用'goto' - 這還帶走了方舟 –

+0

取而代之的是''在裏面if'循環goto',爲什麼不增加? –

+0

這是如何優化? – melpomene

回答

3

是不是隻是

if (anIndex < aVaryingBoundary) { 
    f += .001f; 
    do { 
     if(something) { 
      //code 
      continue; 
     } 
     //more code 
    } while(anIndex < aVaryingBoundary); 
} 

+0

甚至作爲循環體,甚至可以使用if(something){/ * code * /} else {/ * more code * /}';不需要繼續。 –

+0

@JonathanLeffler我不小心從實際需要的時候就離開了那裏。 –

2

這樣你就不需要goto了,編譯器也許可以對它進行優化。

if(anIndex < aVaryingBoundary) { 
    f += .001f; 
    // Tag loop: 
    while (true) { 
     if(something) { 
      //code 
      if(anIndex < aVaryingBoundary) { 
       continue; 
      } 
      else { 
       break; 
      } 
     } 
     //more code 
     if(anIndex < aVaryingBoundary) { 
      continue; 
     } 
     break; 
    } 
} 
// Tag loop_end: 

主邏輯結構保持不變,但沒有更多goto s。

+0

也許是一個布爾變量而不是繼續和斷開。 –

+0

@EdHeal這需要更多的變化。 – iBug

+1

那麼什麼 - 它會使代碼更具可讀性 –

0
if(anIndex < aVaryingBoundary) { 
    f += .001f; 

    while(anIndex < aVaryingBoundary) { 
     if(something) { 
      //code 
      if(anIndex < aVaryingBoundary) continue; 
      else break; 
     } 
     //more code 
    } 
}