13
最適化されない無限の空のループを作成するにはどうすればよいですか?
C11標準は、定数制御式を含む反復ステートメントを最適化してはならないことを示唆しているようです。私はこの回答から私のアドバイスを取り入れています。これは、ドラフト標準のセクション6.8.5を具体的に引用しています。 制御式が定数式ではない反復文...は、実装によって終了するものと想定されます。 その答えでは、ループのようなループwhile(1) ;は最適化の対象とすべきではないと述べています。 では、なぜClang / LLVMは(でコンパイルされたcc -O2 -std=c11 test.c -o test)以下のループを最適化するのですか? #include <stdio.h> static void die() { while(1) ; } int main() { printf("begin\n"); die(); printf("unreachable\n"); } 私のマシンでは、これはを出力しbegin、次に不正な命令(のud2後にトラップが配置されたdie())でクラッシュします。godboltでは、の呼び出し後に何も生成されないことがわかりputsます。 Clangに無限ループを出力させるのは意外と難しい作業でし-O2たが、volatile変数を繰り返しテストすることはできましたが、これには不要なメモリ読み取りが含まれています。そして、私がこのようなことをした場合: #include <stdio.h> static void die() { while(1) ; } int main() { printf("begin\n"); volatile int x = 1; if(x) die(); …