空の式が NOP に評価されるのか、それともコンパイラに依存するのか疑問に思っています。
// Trivial example
int main()
{
;;
}
コンパイラに依存しますが、観察可能な動作は何も起こらないことでなければなりません。実際には、ほとんどのコンパイラは空の式のコードをまったく省略しないと確信しています。
整形式プログラムを実行する適合実装は、同じプログラムと同じ入力を使用した抽象マシンの対応するインスタンスの可能な実行の 1 つと同じ観測可能な動作を生成するものとします。
また、観察可能な動作は次のように定義されます。
準拠する実装の最小要件は次のとおりです。
- volatile オブジェクトへのアクセスは、抽象マシンの規則に従って厳密に評価されます。
- プログラムの終了時に、ファイルに書き込まれたすべてのデータは、抽象セマンティクスに従ってプログラムを実行した場合に生成される可能性のある結果の 1 つと同一でなければなりません。
- 対話型デバイスの入力と出力のダイナミクスは、プログラムが入力を待機する前にプロンプト出力が実際に配信されるような方法で行われます。対話型デバイスを構成するものは実装定義です。
これらはまとめて、プログラムの観察可能な動作と呼ばれます。
これは実際には実装の唯一の要件です。多くの場合、「as-if」ルールとして知られています。コンパイラは、観察可能な動作が期待どおりである限り、好きなことを行うことができます。
意味のあることとして、これらの空の式はnull ステートメントとして知られています。
式が欠落している式ステートメントは、NULL ステートメントと呼ばれます。
本当にNOPが必要な場合は、次を試すことができます:
asm("nop");
ただし、これは条件付きでサポートされており、その動作は実装定義です。
またはそれがコンパイラに依存している場合。
これはコンパイラに依存します (「as-if ルール」) が、ほとんどの合理的な最適化コンパイラは、効率のために空のステートメントを無視し、通常はNOP
命令を発行しません。