2

当我们从用户那里得到输入时,为什么我们需要一个缓冲区?

例如:

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

我读到有一个名为缓冲区的临时变量,用于存储用户键入的输入。所以:

  1. 编译器是否仅在 char 数组的情况下使用缓冲区?如果答案是“否”,那么它什么时候使用?

  2. 在上面的示例中,编译器使用缓冲区的原因是什么?

  3. 如果我上面示例中的缓冲区是一个数组,编译器如何选择它的大小?

4

2 回答 2

3

由于各种原因,涉及多个中间缓冲区:

  1. 操作系统有一个内部缓冲区。这在一定程度上取决于输入设备:磁盘的物理读取是按扇区进行的,因此必须使用扇区大小倍数的缓冲区;键盘输入通常会缓冲到换行符为止,以允许有限程度的编辑(退格等);等等。这对应用程序几乎是透明的,尽管它确实意味着即使只读取一个字符,读取也不会返回,直到用户输入换行符。

  2. istream 使用的streambuf 有一个缓冲区。这样做是为了减少对操作系统的请求数量。这个缓冲区的大小通常取决于 streambuf 的类型;afilebuf通常会针对平台文件 IO 进行优化——大到足以有效减少请求,但不会大到导致分页。在某些系统上,对于某些类型的文件,可能会将filebuf其缓冲区替换为文件的内存映射。

streambuf 具有允许在一定程度上修改其缓冲区管理的功能。但是,很少使用它们。图书馆的作者通常做得很好,你不能轻易改进它。

关于>>操作员:这种缓冲都发生在较低的级别。运算符(实际上是来自 a的>>所有输入istream)将对单个字符或字符数组的请求转发到 streambuf。这种将字符的实际输入与它们的解析解耦是设计的基础istreamistream 只处理解析;它包含一个指向处理实际输入的流缓冲区的指针。(某些解析函数也可能包含缓冲区。例如,>>of anint可能会在开始实际转换之前收集缓冲区中的数字序列。)

于 2012-04-26T07:38:39.020 回答
1

必须有一些地方来存储输入(从外部收集的数据)。缺少这一点,就很难理解为什么要进行输入。

即使对于其他数据类型——最明显的数字保存在intlongfloat(称为标量类型)——也必须声明一个变量来分配足够的存储空间来存储结果:

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

编译器不选择它的大小。你必须声明它;通常可以将其设置得过大,但过小会导致多种问题。

于 2012-04-26T07:05:40.990 回答