9

ReadFile、WriteFile などの Windows 関数や fprintf の代わりに、C++ でストリームを使用する方が非常に簡単であることがわかりました。ストリームを使用するのが良くない場合 いつストリームを使用するのが良いですか? ストリームを使用しても安全ですか? 多くのプログラマーがストリームを使用しないのはなぜですか?

これは私がいつも疑問に思っていることであり、おそらくあなたは知恵を注ぐことができます.

4

7 に答える 7

11

ストリームは一般的に非常に安全です。状況によっては、速度が遅くなったり、ぎこちなくなったりすることがあります。遅いのは、ほとんどの場合、コードと 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 は競争力を持ちません。

于 2010-01-21T18:09:13.720 に答える
10

ストリームを使用するのが良くない場合

  • ストリームは、スレッド セーフであるとは限りません。何らかの同期がないとストリームを使用できない状況を想像するのは簡単です。
  • 通常、ストリーム オブジェクトはかなり「重い」ものです。メモリが少ない環境や組み込み環境では重すぎる場合があります。

いつストリームを使用するのが良いですか?

一般に。

ストリームを使用しても安全ですか?

はい。ただし、ストリームを非同期で共有する場合は注意が必要です。

多くのプログラマーがストリームを使用しないのはなぜですか?

好み、スタイル、または別の方法 (または別の言語) を最初に学びました。オンラインの古い「c++」の例の多くは、C 風味で書かれており、cout よりも printf を好んでいることがわかりました。

于 2010-01-21T18:09:25.673 に答える
4

ストリームで非同期ファイル i/o を行うことはできません...

于 2010-01-21T18:13:57.863 に答える
3
  1. アプリをさまざまなプラットフォームに移植できるようにする場合。

  2. より簡潔なコードが必要な場合: win32 関数はより精巧なセマンティクスを持ち、多くの場合、何かを行うために関数のコレクションを必要とし、間違いなくより多くのパラメーターを持ちます。

于 2010-01-21T17:59:18.247 に答える
1

私が printf() を気に入っている理由の 1 つは、フォーマット文字列自体をリソースにすることができるため、再コンパイルを強制することなく、プログラム出力をより外部から制御できることです。

私が cout() を気に入っている理由の 1 つは、生の速度です。

私の経験では、これはかなり宗教的な問題になる傾向があります。

于 2010-01-21T18:09:48.457 に答える
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);
于 2010-01-21T18:13:59.633 に答える