什么是Flush操作?

10

我是编程新手,今天刚开始学习编程。我看了一些视频和一些书的开头,想找到适合我的学习资源,但我有些内容理解起来有点困难。

其中一个视频使用了endl,另一个使用了\n来介绍基本的“Hello World”,我想了解这两者之间的区别。

所以,我了解到endl\n之间的区别在于endl会刷新代码,而\n不会,这使得endl的速度较慢。这些信息我在谷歌上都可以搜索到。

然而,当我搜索 C++ 的刷新时,由于其中使用了专业术语,我无法理解其含义。

什么是刷新,以及何时和为什么要这样做?什么是缓冲区?

如果可以,请用非常基础的方式解释一下。


这里的解释有帮助吗?你的问题有点宽泛,无法在Stack Overflow上简洁地回答。 - user0042
3
字面上理解,你将水放入浴缸中一直到一定的水位(浴缸是“缓冲区”),然后用 flush() 的方式拉下排水塞。 - user0042
@user0042 - 更加字面的思维过程会使用厕所。水箱(缓冲区)充满水,冲洗时通过允许水从水箱流入马桶盆来排空。 - Peter
@Peter 我更倾向于选择一个“更加中立”的例子,但是没错。 - user0042
@user0042 - 问题在于“拔插头”是一种中性的行为,而冲洗是主动的,因此您的描述并不是指冲洗。 “Flush”一词描述了提供推动力的行为,该推动力直接导致缓冲区清空或水流动,而“拔插头”描述了另一种具有间接允许缓冲区清空(或水流动)副作用的行为。 - Peter
3个回答

8
缓冲区是用于临时存储进程输入的内存,这个过程可能需要一些时间。
它可以为了不丢失任何数据。想象一下一个快速计算机和一个慢速计算机之间的通信。 快速计算机可能以比慢速计算机处理的速度更高的速率发送字节,当慢速计算机处理一个字节时,其他字节还在到达,并存储在缓冲区中等待处理。
或者出于性能原因。所有操作都有一个静态时间成本,与操作处理的数据大小无关(可能需要初始化一些数据,等待资源等)。如果该成本不可忽略,则最好尽可能少地支付该成本。因此,我们使用缓冲区收集更多数据并将多个操作合并为一个。
对于您的情况,屏幕打印没有可忽略的静态时间,这就是为什么默认使用缓冲区,只有在收到足够的字节后才打印数据。
刷新缓冲区意味着清空缓冲区并强制处理其中的数据。如果您想立即处理少量数据,则可以使用它。
例如,如果要打印“请输入您的年龄:”并等待用户输入数字,则最好让用户实际看到该请求! 因此,在这里,刷新缓冲区是必需的。
但是,如果你打印一系列文本(想象一下编译器在编译大型项目时打印许多文本),最好不要刷新缓冲区,而是让缓冲区填满,以便您不会为发送的每个块(例如编译器情况下的每个源文件)花费静态时间。并在最后一个块之后刷新,以确保我们不会停留在缓冲区中间,这很可能发生。

5
@Nicolas Dusart给出了一个很好的答案。这里是相同的信息,但从不同的背景下解释。
“打印到屏幕上”有两种意思:
  1. 最终 打印到屏幕上。 惰性求值 不完美,但理论相同。
  2. 立即 打印到屏幕上。

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

为什么这种令人困惑的行为是智能的呢?想象一下你请了所有的阿姨来,你想给她们倒茶。

  • 当第一个人要求一杯茶时,你可以选择立即跑到厨房给她倒一杯茶,或者最终去厨房给她倒一杯茶。
  • 当最后一个人要求一杯茶时,你可以选择立即跑到厨房给她倒一杯茶,或者最终去厨房给她倒一杯茶。

尽管这两个问题几乎是完全相同的,但回答它们的方式完全不同是有道理的。在泡茶时,您只需煮一次水,只需跑一趟厨房。尽管您想要斟三次茶。(我有三个姑妈哈哈)

现在,因为我们讨论的不是记住请求并立即完成请求的行动,而是处理缓冲区中的数据,所以我们不称此操作为“记住请求”和“立即到厨房”,而是称其为缓冲刷新


因此,明确回答您的问题(并且完全重复我们的好朋友所说):“flush”的意思是“立即处理缓冲区中的数据”。它与“清除缓冲区的数据”是同义词。

当我们考虑将请求缓冲以便稍后处理时,这两个含义之间的区别真正变得模糊。作为一名工程师,我认为任何一种含义都是该术语的有效用法。作为一名计算机科学学生,对我来说,flush只意味着“清除缓冲区”。


0

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

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

endl 和 \n 都可用于打印换行字符,但两者之间有微小的差异:

在使用 endl 时,通过内部调用来刷新缓冲区以清空

在使用 \n 时,会打印换行符,但不会刷新缓冲区,因为不需要额外的调用

因此,从性能方面考虑,endl 优于 \n。


2
就性能而言,endl比\n更糟糕。刷新意味着我们在捷径缓冲区,缓冲区是用于性能原因的,所以不,endl不用于性能问题。 - Nicolas Dusart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接