実行を遅らせることのみを目的とする ANSI C の while ループを考えてみましょう。
unsigned long counter = DELAY_COUNT;
while(counter--);
これが組み込みシステムに遅延を強制するために多く使用されているのを見てきました。機能はなくsleep
、タイマーまたは割り込みは制限されています。
私の ANSI C 標準の解釈は、これは準拠するコンパイラによって完全に削除できるということです。5.1.2.3で説明されている副作用はありません。
揮発性オブジェクトへのアクセス、オブジェクトの変更、ファイルの変更、またはこれらの操作のいずれかを行う関数の呼び出しはすべて、実行環境の状態の変化である副作用です。
...そして、このセクションには次のようにも書かれています。
実際の実装では、式の値が使用されておらず、必要な副作用 (関数の呼び出しや揮発性オブジェクトへのアクセスによるものを含む) が生成されていないと推測できる場合、式の一部を評価する必要はありません。
これは、ループを最適化できることを意味しますか? counter
だったとしてもvolatile
?
ノート:
- これは、「コンパイラーは無限ループを排除することを許可されていますか?」とまったく同じではありません。、それは無限ループを指し、プログラムがいつ終了できるかについて疑問が生じるためです。この場合、最適化の有無にかかわらず、プログラムは確実にこの行を越えて進みます。
- GCC が何をするかは知っていますが (
-O1
でない限り、 for 以上のループを削除しcounter
ますvolatile
)、標準が何を指示しているかを知りたいです。