11

C++03 標準の観察可能な動作 (1.9/6) には、ライブラリ I/O 関数の呼び出しが含まれます。今、私はこのコードを持っています:

printf( "" );

これは正式にはライブラリ I/O 関数の呼び出しですが、効果はありません。

それは観察可能な行動ですか?コンパイラはそれを排除できますか?

4

5 に答える 5

5

である場合、それは確かに観察可能sync_with_stdioですtrue。それが true の場合、出力とのprintf("")同期を強制しstd::cout、以前にバッファリングされた出力をフラッシュします。

于 2011-08-26T15:18:33.760 に答える
2

観測可能だろう

  • 出力がリダイレクトされ、ファイルが閉じられた、切り捨てられた、または何らかの理由で出力が無効になった場合
  • とにかくストリーム状態が「悪い」場合

sync_with_... についての指摘も非常に関連性があります

于 2011-08-26T15:23:59.487 に答える
1

printfスレッドが I/O のブロックを呼び出すときに OS がコンテキスト スイッチを選択した場合、マルチスレッド プログラミングで動作がより顕著になる可能性があるため、私はそれを非常に疑っています。

その場合、結果がスレッドのインターリーブ方法に依存する場合、それは間違いなく効果があります。

于 2011-08-26T14:38:19.650 に答える
1

理論的には、時間に基づいてバッファをフラッシュする方法で C ライブラリを作成できます。その場合、空の文字列を出力するとフラッシュが発生し、目に見える効果が生じる可能性があります。

于 2011-08-26T15:22:25.950 に答える
-3

もちろん、これには観察可能な動作があります-基礎となるファイル記述子を使用して write() システムコールへの呼び出しを生成する必要があります。システムコールの実行は、非常に観察可能な動作です。

極端な例として、カーネル内のファイル記述子が、ファイル書き込み操作が呼び出されるたびにサイレンを鳴らすデバイス ドライバーによって処理される可能性があることを考えてみましょう (OK、やや人為的な例ですが、認めます :-) ...

于 2011-08-26T14:44:58.623 に答える