B M*_*Mai 6 c++ buffer flush endl difference
我是编码和编程的新手(实际上从今天开始)。我一直在观看一些视频并阅读几本书的开头以查看我可以点击哪些内容,但我无法理解其中的一些内容。
在基本的“Hello World”介绍中使用的一个视频endl和另一个使用的视频\n。我想更多地了解两者之间的差异。
所以,我明白endl和之间的区别\n是endl会刷新代码,而\n不会,这会endl变慢。我可以在谷歌上搜索这么多。
但是,在搜索冲洗 C++ 时,由于行话,我无法弄清楚它的含义。
冲洗是什么意思,何时以及为什么要这样做?什么是缓冲区?
如果可以,请以非常基本的方式解释它。
Nic*_*art 10
缓冲区是临时内存,用于存储可能需要一些时间的进程的输入。
它可以是为了不丢失任何数据。想象一下快速计算机和慢速计算机之间的通信。快速计算机可能会以比慢速计算机可以处理的速率更高的速率发送字节,而慢速计算机正在处理一个字节,而其他计算机仍在到达并存储在缓冲区中等待处理。
或者,也可能是出于性能原因。所有操作都有一个静态时间成本,该时间成本与操作处理的数据大小无关(可能需要初始化一些数据、等待资源……)。如果该成本不可忽略,那么尽可能少地支付该成本可能会很有趣。因此,我们使用缓冲区来收集更多数据并将多个操作合并为一个。
对于您的情况,打印到屏幕的静态时间不可忽略,这就是为什么默认情况下使用缓冲区并且仅在接收到足够字节时才打印数据的原因。
刷新缓冲区意味着清空缓冲区并强制处理其中的数据。如果您想立即处理少量数据,它会很有用。
例如,如果您想打印“请输入您的年龄:”并等待用户输入数字,那么最好是用户实际看到该请求!所以在这里,刷新缓冲区是强制性的。
但是,如果您打印文本流(想象一下在编译大型项目时像编译器一样打印许多文本的程序),最好不要刷新并让缓冲区填满,这样您就不会为每个块花费静态时间发送(例如编译器案例的每个源文件)。并在最后一个块之后刷新,以确保我们不会最终到达缓冲区的中间,这很可能是这样。
@Nicolas Dusart 给出了很好的答案。这是相同的信息,但从不同的上下文进行解释。
“打印到屏幕”可能意味着两件事:
现在,当您调用“打印”时,系统会智能地将其解释为最终。不过,您可以要求它立即打印到屏幕上。
为什么这种令人困惑的行为是聪明的?好吧,想象一下你所有的阿姨都过来了,你想给她们倒茶。
尽管这两个问题几乎完全相同,但以完全不同的方式回答它们是有道理的。泡茶时,只需将水烧开一次即可。而你只想跑一次厨房。尽管事实上你想递一杯茶3次。(我有3个阿姨哈哈)
现在,因为我们不是在讨论跑到厨房并完成记住的请求,而是在讨论处理缓冲区中的数据,所以我们不会将此操作称为“记住请求并立即跑到厨房”,而是我们称之为缓冲和刷新。
因此,明确回答您的问题(并正如我们的好朋友所说的那样重复):“刷新”意味着“立即处理缓冲区中的数据”。它与“清除数据缓冲区”同义。
当我们考虑缓冲请求以供稍后完成的情况时,这两种含义之间的区别确实很模糊。作为一名工程师,我认为这两种含义都是该术语的有效用法。作为一名计算机科学专业的学生,刷新对我来说仅意味着“清除缓冲区”。
小智 0
刷新,意味着清空缓冲区。
现在,缓冲区是用于存储数据的临时存储区域。
endl 和 \n 都可以用于打印换行符,但这两者之间有细微的区别:
在 endl 的情况下,通过使用内部调用刷新缓冲区来清除缓冲区
如果是 \n,则会打印换行符,但不会刷新缓冲区,因为没有进行额外的调用
所以从性能角度来看,endl优于\n
| 归档时间: |
|
| 查看次数: |
2115 次 |
| 最近记录: |