C++03 標準の観察可能な動作 (1.9/6) には、ライブラリ I/O 関数の呼び出しが含まれます。今、私はこのコードを持っています:
printf( "" );
これは正式にはライブラリ I/O 関数の呼び出しですが、効果はありません。
それは観察可能な行動ですか?コンパイラはそれを排除できますか?
C++03 標準の観察可能な動作 (1.9/6) には、ライブラリ I/O 関数の呼び出しが含まれます。今、私はこのコードを持っています:
printf( "" );
これは正式にはライブラリ I/O 関数の呼び出しですが、効果はありません。
それは観察可能な行動ですか?コンパイラはそれを排除できますか?
である場合、それは確かに観察可能sync_with_stdio
ですtrue
。それが true の場合、出力とのprintf("")
同期を強制しstd::cout
、以前にバッファリングされた出力をフラッシュします。
観測可能だろう
sync_with_... についての指摘も非常に関連性があります
printf
スレッドが I/O のブロックを呼び出すときに OS がコンテキスト スイッチを選択した場合、マルチスレッド プログラミングで動作がより顕著になる可能性があるため、私はそれを非常に疑っています。
その場合、結果がスレッドのインターリーブ方法に依存する場合、それは間違いなく効果があります。
理論的には、時間に基づいてバッファをフラッシュする方法で C ライブラリを作成できます。その場合、空の文字列を出力するとフラッシュが発生し、目に見える効果が生じる可能性があります。
もちろん、これには観察可能な動作があります-基礎となるファイル記述子を使用して write() システムコールへの呼び出しを生成する必要があります。システムコールの実行は、非常に観察可能な動作です。
極端な例として、カーネル内のファイル記述子が、ファイル書き込み操作が呼び出されるたびにサイレンを鳴らすデバイス ドライバーによって処理される可能性があることを考えてみましょう (OK、やや人為的な例ですが、認めます :-) ...