什么是冲洗?

时间:2017-12-10 04:26:33

标签: c++ buffer difference flush endl

我是编码和编程的新手(实际上是今天开始的)。我一直在看一些视频并在几本书的开头阅读,看看我可以点击哪些,但我很难理解其中一些。

其中一个视频使用了endl,另一个使用了\n基本的" Hello World"介绍。我想更多地了解两者之间的差异。

因此,我了解endl\n之间的区别在于endl会刷新代码而\n则不会,这会使endl变慢。我可以在Google上搜索这么多。

但是,在搜索流畅的C ++时,由于行话的原因,我无法做出它的意思。

冲洗是什么意思,何时以及为什么要冲洗?什么是缓冲区?

如果可以的话,请以非常基本的方式解释。

3 个答案:

答案 0 :(得分:1)

@Nicolas Dusart 给出了很好的答案。以下是相同的信息,但从不同的上下文进行解释。


“打印到屏幕”可能意味着两件事:

  1. 最终打印到屏幕上。 lazy evaluation 不是一个完美的类比,但理论是一样的。
  2. 立即打印到屏幕上。

现在,当您调用“打印”时,系统会智能地将其解释为最终。但是,您可以要求它立即打印到屏幕上。

为什么这种令人困惑的行为是智能的?好吧,想象一下你所有的阿姨都过来了,你想给他们端茶。

  • 当第一个要杯子时,您可以选择立即跑到厨房给她做杯子,或者最终跑到厨房做给她一杯。
  • 当最后一个要杯子时,您可以选择立即跑到厨房给她做杯子,或者最终跑到厨房做给她一杯。

尽管这两个问题几乎完全相同,但以完全不同的方式回答它们是有意义的。泡茶时,只需要将水烧开一次。而你只想跑到厨房一次。尽管您想分发一杯茶 3 次。 (我有 3 个阿姨哈哈)

现在,因为我们不是在谈论跑到厨房并完成记住的请求,而是在谈论处理缓冲区中的数据,所以我们不会将此操作称为记住请求立即跑到厨房,但我们称之为缓冲冲洗.


所以明确地回答你的问题(并完全按照我们的好朋友说的重复一遍):“flush”的意思是“立即处理缓冲区中的数据”。它与“清除数据缓冲区”同义。

当我们考虑缓冲请求以供稍后完成的情况时,这两种含义之间的区别真的很模糊。作为一名工程师,我认为这两种含义都是该术语的有效用法。作为一名计算机科学专业的学生,​​刷新对我来说仅意味着“清除缓冲区”。

答案 1 :(得分:0)

要刷新,意味着清空缓冲区。

现在,缓冲区是用于存储数据的临时存储区域。

endl和\ n都可用于打印换行符,但这两者之间存在细微差别:

在endl的情况下,通过使用内部调用来清除缓冲区以刷新缓冲区

如果是\ n,则会打印换行符,但不会刷新缓冲区,因为不会进行额外调用

因此,性能方面,endl优于\ n

答案 2 :(得分:0)

缓冲区是临时内存,用于存储可能需要一些时间的进程输入。

它可以是不丢失任何数据。想想快速计算机和慢速计算机之间的通信。快速计算机可以以比慢速处理的速率更高的速率发送字节,而慢速计算机则处理一个字节,其他的仍然到达并且它们存储在等待处理的缓冲区中。

或者,它可能是出于性能原因。所有操作都具有静态时间成本,该时间与操作处理的数据大小无关(可能需要初始化某些数据,等待资源,......)。如果这个成本不可忽视,那么尽可能少地支付这笔费用可能会很有趣。因此,我们使用缓冲区来收集更多数据并将多个操作合并为一个。

对于您的情况,打印到屏幕的静态时间不可忽略,这就是默认情况下使用缓冲区的原因,只有在收到足够的字节时才打印数据。

刷新缓冲区意味着清空它并强制处理其中的数据。如果您想立即处理少量数据,这将非常有用。

例如,如果您要打印“请输入您的年龄:”并等待用户输入数字,则用户最好看到该请求!所以在这里,必须刷新缓冲区。

但是如果你打印一个文本流(想想一个程序在编译一个大项目时打印许多文本就像编译器一样),最好不要刷新并让缓冲区填满,这样你就不会花费静态时间您发送的每个块(例如,编译器案例的每个源文件)。并且在最后一个块之后刷新以确保我们不会在缓冲区的中间结束,这很可能。