2017-11-11 6 views
1

私はこのようなものだったコードの一部を持っていましたgotoを使うことでした。非自明の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'を使用している - その代わりに' goto'、なぜ単に 'if'内のループを追加していないの箱舟 –

+0

で去って行ったこと? –

+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

おそらく、continueとbreakの代わりにブール変数です。 –

+0

@EdHealそれ以上の変更が必要です。 – iBug

+1

だから、コードを読みやすくするでしょう。 –

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

    while(anIndex < aVaryingBoundary) { 
     if(something) { 
      //code 
      if(anIndex < aVaryingBoundary) continue; 
      else break; 
     } 
     //more code 
    } 
} 
関連する問題