121

私はC++を学んでいて、理解できない何かを見つけました:

出力バッファーを明示的にフラッシュして、バッファーを強制的に書き込むことができます。デフォルトでは、読み取りはcinフラッシュしcoutます。coutプログラムが正常に終了したときにもフラッシュされます。

したがって、バッファ(たとえば、出力バッファ)をフラッシュします。これは、バッファ内のすべてを削除してバッファをクリアしますか、それともすべてを出力してバッファをクリアしますか?それとも、バッファをフラッシュすることは、まったく異なることを意味しますか?

4

3 に答える 3

152

ファイルへの書き込みを検討してください。これは費用のかかる操作です。コードで一度に1バイトを書き込む場合、1バイトを書き込むたびに非常にコストがかかります。したがって、パフォーマンスを向上させる一般的な方法は、書き込んでいるデータを一時バッファーに格納することです。大量のデータがある場合にのみ、バッファがファイルに書き込まれます。書き込みを延期し、一度に大きなブロックを書き込むことで、パフォーマンスが向上します。

これを念頭に置いて、バッファのフラッシュは、データをバッファからファイルに転送する行為です。

これは、バッファ内のすべてを削除してバッファをクリアしますか、それともバッファ内のすべてを出力してバッファをクリアしますか?

後者。

于 2013-02-23T16:42:04.677 に答える
27

あなたは答えを引用しました:

出力バッファーを明示的にフラッシュして、バッファーを強制的に書き込むことができます。

つまり、出力を「フラッシュ」して、基になるストリーム(ファイル、またはリストされている例では端末)に書き込む必要がある場合があります。

通常、stdout / coutは行バッファリングされます。改行を書き込むか、バッファを明示的にフラッシュするまで、出力はOSに送信されません。利点は、のようなものではstd::cout << "Mouse moved (" << p.x << ", " << p.y << ")" << endl、基になる「ファイル」への書き込みが6回ではなく1回だけになることです。これにより、パフォーマンスが大幅に向上します。欠点は、次のようなコードです。

for (int i = 0; i < 5; i++) {
    std::cout << ".";
    sleep(1); // or something similar
}

std::cout << "\n";

すぐに出力.....されます(正確なsleep実装については、この質問を参照してください)。このような場合、<< std::flush出力が確実に表示されるように追加する必要があります。

cinフラッシュを読み取るcoutため、これを行うために明示的なフラッシュは必要ありません。

std::string colour;
std::cout << "Enter your favourite colour: ";
std::cin >> colour;
于 2013-02-23T16:50:05.067 に答える
5

すべてを出力してバッファをクリアします。

于 2013-02-23T16:41:57.777 に答える