様々な理由のために関与するいくつかの中間バッファは、あります
OSが内部バッファを持っています。これは入力に幾分依存します デバイス:ディスクからの物理読み取りはセクタによって行われるため、 のセクタサイズの倍数であるバッファを使用する必要があります。キーボードの入力は です。改行文字までは通常はバッファされますが、編集の程度(バックスペースなど)は です。等々。これはほとんどの場合 がアプリケーションに透過的ですが、 が1文字だけ読み取っても、ユーザー が改行を入力するまで読み取りは返されません。
istreamで使用されるstreambufにはバッファがあります。これは、 に、OSへの要求数を減らすために行われます。このバッファのサイズは通常、streambufのタイプに依存します。 filebuf
は、通常、 プラットフォームファイルIO —に最適化され、効果的に の要求を減らすのに十分な大きさですが、ページングを誘導するほど大きくはありません。一部のシステムでは、ファイルの種類によっては がありますが、filebuf
は、 バッファをファイルのメモリマッピングに置き換える可能性があります。
streambufには、バッファ管理の変更を可能にする機能があります。 。しかし、それらを使用すべきであることは非常にまれです。図書館の著者 は、一般的には、あなたが簡単に改善することができないほど十分な仕事をしています。
>>
演算子に関して:このバッファリングはすべて、下位の レベルで発生します。 >>
演算子(実際にはistream
からのすべての入力) は、個々の文字または文字配列の要求を streambufに転送します。 の文字の実際の入力をデカップリングすることは、istream
というデザインの基本です。istream
は解析のみを行います。実際の入力を処理するstreambuf へのポインタを含んでいます。 (解析関数の一部 もバッファが含まれていてもよい。例えば、int
の>>
は、実際の変換を開始する前に、バッファ内の数字の シーケンスを収集する場合があります。)
C++を使用すると、おそらくべき 'STRING'型を持っています代わりに使用してください。バッファーを使用するコンパイラーではなく、プログラマーの* you *です。サイズの選択と同じ扱い - コードを書くときの責任はあなたの責任です。文字列型を使用すると、これらの問題などが解決されます。 –
@CodyGray:std :: stringを使用すると簡単に行くことができます。私はちょうどコンパイラがどのようにこれを行うのか理解しようとしていますあなたは私の質問に対するアンサーを持っていれば、私はそれをpreciateします。ありがとう – AlexDan
"私はバッファーと呼ばれる一時変数があることを読んで"非常に真ではありません。あなたがその名前で変数を作るならば、変数呼び出し側 'buffer'だけがあります!現在、システムはすべての入出力にバッファーを使用することがありますが、低コンソールアプリケーションはそれらの近くでは使用できません。 –