web-dev-qa-db-ja.com

バッファのフラッシュとはどういう意味ですか?

私はC++を学んでいますが、理解できないものを見つけました。

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

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

83

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

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

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

後者。

98
David Heffernan

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

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

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

一般に、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;
19
tc.

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

3