首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >输出流缓冲区在std::cout和std::endl上下文中的使用

输出流缓冲区在std::cout和std::endl上下文中的使用
EN

Stack Overflow用户
提问于 2018-09-30 18:51:39
回答 1查看 513关注 0票数 0

我试图了解输出流缓冲区是如何工作的。我没有找到任何能解释在std::cout上下文中编写标准输出的整个过程的东西。据我所知,std::cout实际上并不在标准输出上打印,而是将内容写入终端模拟器的输出流缓冲区。当缓冲区已满时,终端模拟器将删除缓冲区的内容并将其写入终端显示器(标准输出)。据我所知,当终端仿真器执行flush操作时,就会发生这种情况。

std::endl的情况下,会向终端仿真器发出显式请求,以立即刷新缓冲区的内容,从而导致性能下降。造成此删除的原因是我们的程序需要花费时间向终端仿真器创建flush请求,并等待在终端显示上打印缓冲区的内容,然后再继续到下一行代码。如果没有std::endlstd::cout并不关心立即打印内容。它将打印的责任留给终端模拟器(通过将内容写入终端模拟器的输出流缓冲区)。我有几个疑问:

(1)我对终端模拟器如何显示std::cout所要求的文本的理解是否准确?

(2) flush请求是向操作系统还是终端模拟器提出的?

(3)如果增加终端仿真器的输出流缓冲区大小,是否会增加程序的性能,同时显着地延迟在显示器上打印内容?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-30 19:06:18

不,你的理解不对。“终端仿真器”不涉及,至少不直接涉及。

输出缓冲区驻留在流对象本身内(本例中为std::cout)。根据流的缓冲策略,使用此缓冲区有三种可能的方式:

  • 块缓冲:输出首先存储在缓冲区中。当缓冲区满时,它被“刷新”,即它的内容被写入底层(特定于操作系统的)输出通道,并且缓冲区被清空。
  • 行缓冲:类似于块缓冲,但是每当向其写入换行符('\n')时,缓冲区也会被刷新。
  • 未缓冲:未使用输出缓冲区。所有输出都会立即写入。

打开文件时,流将开始被块缓冲。std::cerr没有缓冲。如果输出转到终端,而块被缓冲,则std::cout是行缓冲的。

std::flush会立即刷新输出缓冲区(如果有)。

至于数据是如何编写的,细节取决于您的操作系统。在unix系统上,有一个名为write的系统调用(“系统调用”是对操作系统执行某些操作的请求)。系统调用通常比正常函数调用慢;输出缓冲区是性能优化,因为您不想对输出的每个字符调用write。在内部收集输出,直到需要编写更大的文本为止,这意味着对write的调用减少,这意味着更好的整体性能。

至于你的具体问题:

  1. 不,终端模拟器不相关。
  2. 操作系统。
  3. 缓冲区位于流对象中,而不是终端模拟器中。增加缓冲区大小不再给您在某一点之后的任何性能好处。您的程序通常会将大部分时间用于计算结果和做其他事情,而不是将文本写入std::cout
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52581080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档