-3

while ループにこの本体がある場合は次のようになります。

while(a<b){
  do_some_calculations
 }

計算を行い、while ループを再度チェックします。ただし、空のwhileループがある場合:

while(a<b) { }

どのくらいの頻度で条件をチェックしますか? while ループがcmpandjmp命令にコンパイルされることはわかっています (これには 1 ~ 2 サイクルかかります)。それで、1〜2サイクルごとにwhileループをチェックしますか?それともそうではないのですか?わからないことがありますか?詳しい解説とても参考になります。

PS 質問は低レベルの詳細についてです。もっと注意深く読んでください。そして、「コンパイラ依存など」ではなく、共通の原則を知りたいです。

PPS いくつかの有効な条件とコンパイラによって生成されたコードがあるとしましょう。どのくらいの頻度でそれをチェックするのでしょうか?それが問題です。

4

7 に答える 7

4

標準では、生成されたアセンブリで多くのソリューションが許可されているため、質問は「コンパイラは何をするのか」に要約されます。そのため、例によってのみ答えることができます。

GCC 4.2.1(Apple Inc.ビルド5658に基づく)(LLVMビルド2336.11.00)を使用して次のテストを実行しました。

main.cpp:

int main() {
    while (true) { }
}

次のコマンドラインでコンパイルしました。

g++ -S main.cpp

そして、出力の簡略化されたバージョンmain.Sは、次のようになります。

LBB1_1:
    jmp  LBB1_1

したがって、最適化を行わないと、コンパイラはチェックする条件がないことを認識し、タイトなループを生成するだけです。

少なくとも最適化が有効になっている場合は、他のコンパイラでも同じことができると思います。確認する唯一の方法はチェックすることです:)

于 2013-03-21T11:48:37.237 に答える
4

あなたは正しい質問をしていないようです。質問にアセンブラー コードを生成する言語が関係している場合、答えは、コンパイラー、最適化レベル、およびその他の特定のものに依存しますが、最も重要なことは、条件に依存するということです。各ループは 1 つのテストを実行します。そのテストにデータベースにアクセスしてそこで何かをチェックすることが含まれている場合、(例として) 有効期限に対して現地時間をチェックする場合よりも、ループが実行される頻度ははるかに少なくなります。状態についてさらに知識がなくても、一般的な答えはありません。もちろん、条件によっては、コンパイラがテストを最適化できる場合もありますが、これは、コードの目に見える動作がそれに依存しない場合に限られます。したがって、概念的には、条件は繰り返しごとにチェックされます。もちろん、条件が false になり、ループが終了するまでは。

于 2013-03-21T11:57:53.797 に答える
2

コードはタイトなループを作成しますが、それが空の場合は for のような無限ループになります(;;)- 終了条件のないループで、すべてのプロセッサ リソースまたは 100% / number_of_cores (マルチコアの場合) を消費します。このようなコードはシステム全体を「フリーズ」させることができますが、現在はすべての OS のスケジューラがプリエンプティブであるため、タイム クォンタム (OS に応じて 1 ~ 200 ミリ秒) のみを実行し、このクォンタム内では毎回中断することなく実行されます。本体が空の場合、およびコンパイラが最適化のために条件を削除しない場合は、2 ~ 5 サイクル。ですから、多くの人がそう考えているように、あなたの質問は曖昧で間違っていると思います。

于 2013-03-21T12:22:40.660 に答える
1

ループでは、whileループに入る前に条件がチェックされるため、ループを通過した回数よりも 1 回多くチェックされます。

少なくとも抽象機械では。コンパイラは最適化できます。したがって、あなたの例では、コンパイラがaandの値を知ることができる場合b(たとえば、直前に定数が割り当てられているため)、チェックを行うコードを生成しない場合があります。条件を変更できるものがループに明らかに含まれていない場合、結果が変更されないため、最初のチェックの後にチェックが生成されない可能性があります。コンパイラの唯一の実際の制限は、観察可能な出力が比較が行われた場合と同じであることです。(コンパイラは、ループがいつか終了すると想定して、コードをその上のループの下に移動することも許可されていると思います。)

于 2013-03-21T12:28:15.803 に答える
1

反復ごとに条件がチェックされたかのように動作するコードが生成されます。

コンパイラは、繰り返しごとに条件をチェックする必要がないことを証明できる場合、チェックを削除することがあります。しかし、それは個々のコンパイラ次第であり、フィードする正確なコードに依存します。

于 2013-03-21T11:52:34.587 に答える
0

コンパイラがこれをどのように変換するかは、それが機能する限り、C または C++ には関係ありません。ループをまったく実行する必要がないことをコンパイラが確認できる場合は、ループを削除できます。ループを展開し、最初のチェック以外のすべてを完全に削除する場合があります。それはすべてコンパイラとコードに依存し、単一の答えはありません。

コンパイラが最適化をまったく行わない場合、標準で要求されているとおりに実行されます。つまり、各反復の開始時に 1 つのチェックが行われます。

于 2013-03-21T11:57:31.657 に答える
0

有効な条件とコンパイラが生成したコードがあるとしましょう。どのくらいの頻度でそれをチェックするのでしょうか?それが問題です。

最適化がない場合は各ループで、最適化があり、コンパイラーが条件が変わらないことを理解している場合は決してありません。

于 2013-03-21T11:56:24.307 に答える