c-什么是流缓冲

  • 本文关键字:缓冲 stream buffer
  • 更新时间 :
  • 英文 :


我已经开始学习C编程,所以我是一个初学者,在学习标准文本流时,我想到了"stdout"流是缓冲的,而"stderr"流不是缓冲的,但我无法理解这些行。

我已经在这个论坛上读过关于"缓冲"的文章,我喜欢糖果的比喻,但我不明白当一个说:"这个流被缓冲了,而另一个没有。"效果是什么?

有什么区别?

更新:是否会影响处理速度?

Buffer是一块属于流的内存,用于临时保存流数据。当对文件进行第一次I/O操作时,调用malloc并获得缓冲区。写入流的字符通常会在缓冲区中累积(在以块的形式传输到文件之前),而不是在应用程序输出后立即出现。类似地,流以块的形式而不是逐个字符的方式从主机环境检索输入。这样做是为了提高效率,因为与内存操作相比,文件和控制台I/O速度较慢。

GCC提供三种类型的缓冲——非缓冲、块缓冲和行缓冲。无缓冲意味着一旦写入(对于输出流),字符就会出现在目标文件上,或者在逐个字符的基础上从文件中读取输入,而不是在块中读取(对于输入流)。块缓冲意味着字符被保存在缓冲区中,并作为块写入或读取。行缓冲意味着字符只保存到将换行写入缓冲区或从缓冲区读取换行符为止。CCD_ 2和CCD_。默认情况下,stderr总是不缓冲的。

标准库提供了更改流的默认行为的函数。可以使用fflush强制输出流缓冲区中的数据(输入流未定义fflush)。您可以使用setbuf函数使流不缓冲。

缓冲是在写入许多元素之前收集它们,或者在处理它们之前同时读取许多元素。互联网上有很多信息,例如,这个

以及其他类似的SO问题

编辑回应问题更新:是的,这是出于性能原因。在任何情况下,对大多数设备来说,从磁盘等写入和读取都会写入或读取某种类型的"块",并且这样做会有相当大的开销。因此,批量处理这些操作可以带来显著的性能差异

写入缓冲输出的程序可以在写入缓冲区所需的时间内执行输出,这通常非常快,与可能较慢的输出设备的速度无关。

对于缓冲输出,信息是队列,并且单独的过程处理输出呈现。

在无缓冲输出的情况下,数据直接写入输出设备,因此在设备上以一定的速度运行。这对于错误输出很重要,因为如果输出被缓冲,则在缓冲的输出显示之前,进程可能会失败,因此程序可能会在没有诊断输出的情况下终止。

相关内容

  • 没有找到相关文章

最新更新