ReadFile、WriteFile などの Windows 関数や fprintf の代わりに、C++ でストリームを使用する方が非常に簡単であることがわかりました。ストリームを使用するのが良くない場合 いつストリームを使用するのが良いですか? ストリームを使用しても安全ですか? 多くのプログラマーがストリームを使用しないのはなぜですか?
これは私がいつも疑問に思っていることであり、おそらくあなたは知恵を注ぐことができます.
ストリームは一般的に非常に安全です。状況によっては、速度が遅くなったり、ぎこちなくなったりすることがあります。遅いのは、ほとんどの場合、コードと OS の間にいくつかの余分なレイヤーを課すという事実に起因し、間違った状況ではそれらのレイヤーがオーバーヘッドを追加する可能性があります。不器用さは主に C の printf と比較してのものであり、WriteFile のようなものを直接使用するものではありません (フォーマットを直接サポートしていません)。ただし、たとえば、次のことを考慮してください。
printf("%2.2x", ch);`
に
std::cout << std::hex << std::setw(2) << std::setprecision(2) << std::setfill('0') << ch;
std::cout << setfill(' ');
次に、i18n に関心がある場合printf
は、C++ ストリームがすべての書式設定をコードの構造に埋め込んでいる外部ソースから読みやすい文字列を使用しているため、書式設定のほとんどすべての変更には、コード、再コンパイル、再リンク。
CreateFile, ReadFile
などでは、メモリ マップ ファイルやオーバーラップした読み取りと書き込みなど、iostream ではまったくサポートされていない多くのことも可能です。これらをうまく活用できる状況であれば、多くの場合、iostream は競争力を持ちません。
ストリームを使用するのが良くない場合
いつストリームを使用するのが良いですか?
一般に。
ストリームを使用しても安全ですか?
はい。ただし、ストリームを非同期で共有する場合は注意が必要です。
多くのプログラマーがストリームを使用しないのはなぜですか?
好み、スタイル、または別の方法 (または別の言語) を最初に学びました。オンラインの古い「c++」の例の多くは、C 風味で書かれており、cout よりも printf を好んでいることがわかりました。
ストリームで非同期ファイル i/o を行うことはできません...
アプリをさまざまなプラットフォームに移植できるようにする場合。
より簡潔なコードが必要な場合: win32 関数はより精巧なセマンティクスを持ち、多くの場合、何かを行うために関数のコレクションを必要とし、間違いなくより多くのパラメーターを持ちます。
私が printf() を気に入っている理由の 1 つは、フォーマット文字列自体をリソースにすることができるため、再コンパイルを強制することなく、プログラム出力をより外部から制御できることです。
私が cout() を気に入っている理由の 1 つは、生の速度です。
私の経験では、これはかなり宗教的な問題になる傾向があります。
理由の 1 つはi18nです
string time = "4:32";
cout << "the current time is " << time;
cout << "वर्तमान समय " << time << " है।"
cout << time << "في الوقت الحالي هو";
対
string format = "the current time is %s";
string format = "वर्तमान समय %s है।";
string format = "%s في الوقت الحالي هو";
printf(format, time);