2011-11-20 4 views
2

C/C++言語で... forループは内部でwhileループとコンパイルされていますか?C/C++言語では... forループはWhileループとして内部的にコンパイルされますか?

+0

同様の質問には、このようなパフォーマンスの違いは何であるとして、求められています。基本的に同じ質問です。 http:// stackoverflow。com/questions/2879145/c-performance-for-while/2879158#2879158 – JohnB

+0

正確な重複はありません。これは特にMS Visual C++について質問し、もう1つの質問はg ++/intelコンパイラについて質問するようです。 – Kev

答えて

5

はい、通常、基本的には、ループのため、

あなたはしばらくのために翻訳したときに、スコーピングは、」可能性があるため、これは、アカウントのスコープと、このような問題になりませんのでご注意

a; 
while (b) { ...; c; } 

のように書き換えることができ

for (a; b; c) { ... } 
を書かC++の構文で正確に記述することができます。

しかし、下に、ループの実際の文と(条件)GOTOSの系列である:

{ 
      a; 
      goto test; 

    body: 
      ...; 
      c; 

    test: 
      if (b) goto body: 
} 

そのすべてはアセンブリコードであることを除いて。

+0

ループでより多くのブレースを使用できます。 'a'の範囲はループの中にあり、' c'はいくつかの中括弧で区切られていると私は信じています。 – Pubby

+0

@Pubbyはい、私はその効果にコメントを追加しました。しかし、それらの周りに{}を追加すると、実際には同じではありません。それは、それが実際のものであるだけでなく、2つのスコープを作成するためです。私はそれが正しく書かれているとは思わない。 –

2

私はあなたがこのように考えることができたとします。与えられた

for (initialization; condition; updater) { body; } 

それは、このアナログ生成:

{ 
    initialization; 
    while (condition) 
    { 
    ... // body 
    updater; 
    } 
} 

をしかし、それはいくつかのことを注意することが重要です。

  1. 初期化はiの一部です範囲内のスコープ。したがって、変数を宣言すると、forループの外側にエスケープされません。
  2. アップデータコードをスキップすることはできません(forループから抜け出すことを除いて)。これは、while()ループとは異なり、continueあなた自身の更新コードを通り過ぎる可能性があります。私。あなたはアップデータが実行されているかどうかを確認する責任がありますが、コンパイラはそれをforループのために強制します。
+0

ポイント2の寄与分+1。微妙な違いがありますが、それは私にはあまり重要ではありません。 – JohnB

2

ループがアセンブリにどのように生成されるかは、実際にはコンパイラによって異なります。一般に、手作業でループを手作業でコーディングすると、アセンブリでは少し違って見えます。これらの最適化はおそらくあなたのコードにとってはマイナーですが、必要に応じて余分な負荷やストアを節約することができます。しかし、ループ条件(カウンタの場合)は、いずれもレジスタで算術演算が行われる可能性が最も高いです。これを試してみてください(あなたが++のgcc/gのを使用している場合)

はあなたの組み立てを確認するには:

gcc -S -o your_asm_file.s your_src.c

はその後*.sファイル内部を見てみましょう。これはまさにコンパイラがマシンコードを扱っているところです。完全性について

2

投稿:

for (a; b; c) d; 

は同等です:

{ 
    a; 
    while(b) 
    { 
    { 
     d; 
    } 
    c; 
    } 
} 
関連する問題