2

ユーザーからの入力を取得するときに、なぜバッファが必要なのですか?

例えば:

chat arr[10];
cin>>arr;
// or
cin.get(arr,10);

ユーザーが入力した入力を格納する buffer という一時変数があることを読みました。そう:

  1. コンパイラはchar配列の場合にのみバッファを使用しますか? 答えが「いいえ」の場合、いつ使用されますか?

  2. 上記の例でコンパイラがバッファを使用する理由は何ですか?

  3. 上記の例のバッファーが配列の場合、コンパイラーはそのサイズをどのように選択しますか?

4

2 に答える 2

3

さまざまな理由から、いくつかの中間バッファーが関係しています。

  1. OSには内部バッファがあります。これは、入力デバイスに多少依存します。ディスクからの物理読み取りはセクター単位であるため、セクター サイズの倍数のバッファーを使用する必要があります。キーボード入力は通常、改行文字までバッファリングされ、限られた程度の編集 (バックスペースなど) が許可されます。等々。これは、アプリケーションに対してほとんど透過的ですが、1 文字だけを読み取る場合でも、ユーザーが改行を入力するまで読み取りが返されないことを意味します。

  2. istream が使用する streambuf にはバッファがあります。これは、OS への要求の数を減らすために行われます。このバッファのサイズは、通常、streambuf のタイプによって異なります。afilebufは通常、プラットフォーム ファイル IO 用に最適化されます。これは、要求を効果的に減らすのに十分な大きさですが、ページングを誘発するほど大きくはありません。システムによっては、ファイルの種類によって、filebufがそのバッファをファイルのメモリ マッピングに置き換える可能性があります。

streambuf には、バッファ管理を多少変更できる機能があります。ただし、それらを使用する必要があることは非常にまれです。ライブラリの作成者は、一般に、簡単に改善できないほど十分に優れた仕事をしています。

オペレーターに関して>>: このバッファリングはすべて下位レベルで行われます。>>オペレーター (および実際には からのすべての入力)istreamは、個々の文字または文字の配列の要求を streambuf に転送します。文字の解析から文字の実際の入力を分離することは、 の設計の基本istreamですistream 。 は解析のみを処理します。実際の入力を処理する streambuf へのポインタが含まれています。(一部の解析関数にはバッファが含まれる場合もあります。たとえば、>>of は、int実際の変換を開始する前にバッファ内の数字のシーケンスを収集する場合があります。)

于 2012-04-26T07:38:39.020 に答える
1

入力 (外部から収集されたデータ) を格納する場所が必要です。これがないと、なぜ入力が行われるのかを理解するのは困難です。

int他のデータ型 ( 、long、および(スカラー型floatとして知られている)で最も明確に保持される数値) の場合でも、結果を格納するのに十分なストレージを割り当てる変数を宣言する必要があります。

long  n;
double  d;
cin >> n;
cin >> d;

コンパイラはそのサイズを選択しません。それを宣言する必要があります。通常は大きすぎても問題ありませんが、小さすぎるとさまざまな問題が発生する可能性があります。

于 2012-04-26T07:05:40.990 に答える