9

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

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

endl所以,我知道和之间的区别在于\nendl刷新代码而不会刷新代码\n,这会endl变慢。我可以在谷歌上搜索到这么多。

但是,在搜索刷新 C++ 时,由于行话,我无法理解它的含义。

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

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

4

3 回答 3

6

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

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

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

对于您的情况,打印到屏幕的静态时间可忽略不计,这就是为什么默认使用缓冲区并且仅在接收到足够字节时才打印数据的原因。

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

例如,如果您想打印“请输入您的年龄:”并等待用户输入数字,则最好让用户实际看到该请求!所以在这里,刷新缓冲区是强制性的。

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

于 2017-12-10T05:24:11.990 回答
2

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


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

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

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

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

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

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

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


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

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

于 2021-03-22T17:21:31.217 回答
0

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

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

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

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

在 \n 的情况下,会打印换行符,但不会刷新缓冲区,因为没有进行额外的调用

所以在性能方面,endl 优于 \n

于 2017-12-10T04:47:57.850 回答