【问题标题】:What exactly is flushing?究竟什么是冲洗?
【发布时间】:2018-05-23 23:14:03
【问题描述】:

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

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

所以,我知道endl\n 之间的区别在于endl 将刷新代码而\n 不会,这使得endl 更慢。我可以在 Google 上搜索到这么多。

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

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

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

【问题讨论】:

  • 解释here有帮助吗?您的问题有点宽泛,需要在 Stack Overflow 上简明扼要地回答。
  • 从字面上考虑。你让一些水流入你的浴缸直到一定量(浴缸是缓冲区),然后flush()你拔掉插头。
  • @user0042 - 更直接的思考过程将使用厕所。蓄水池(缓冲器)填满,通过允许蓄水池中的水移动到马桶便池进行冲洗。
  • @Peter 我更喜欢选择一个更中立的示例,但是是的。
  • @user0042 - 问题是“拔掉插头”是一个中性动作,而冲洗是活动的,所以你的描述不是冲洗。 “冲水”一词描述了一种提供动力的动作,该动作直接导致缓冲区清空或水移动,而“拔塞”一词则描述了另一个具有副作用的动作i>间接允许缓冲区清空(或水移动)。

标签: c++ buffer difference flush endl


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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


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

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

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

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

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

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

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


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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      所以性能方面,endl 比 \n 好

      【讨论】:

      • 性能方面,endl 实际上比 \n 差。刷新意味着我们正在缩短缓冲区,并且缓冲区是出于性能原因,所以不,endl 不用于性能问题。
      猜你喜欢
      • 2018-01-29
      • 2014-09-11
      • 2021-11-13
      • 2014-10-28
      • 2012-08-27
      • 2010-11-12
      • 2011-03-18
      • 2011-01-22
      相关资源
      最近更新 更多