我试图了解输出流缓冲区是如何工作的。我没有找到任何能解释在std::cout
上下文中编写标准输出的整个过程的东西。据我所知,std::cout
实际上并不在标准输出上打印,而是将内容写入终端模拟器的输出流缓冲区。当缓冲区已满时,终端模拟器将删除缓冲区的内容并将其写入终端显示器(标准输出)。据我所知,当终端仿真器执行flush
操作时,就会发生这种情况。
在std::endl
的情况下,会向终端仿真器发出显式请求,以立即刷新缓冲区的内容,从而导致性能下降。造成此删除的原因是我们的程序需要花费时间向终端仿真器创建flush
请求,并等待在终端显示上打印缓冲区的内容,然后再继续到下一行代码。如果没有std::endl
,std::cout
并不关心立即打印内容。它将打印的责任留给终端模拟器(通过将内容写入终端模拟器的输出流缓冲区)。我有几个疑问:
(1)我对终端模拟器如何显示std::cout
所要求的文本的理解是否准确?
(2) flush
请求是向操作系统还是终端模拟器提出的?
(3)如果增加终端仿真器的输出流缓冲区大小,是否会增加程序的性能,同时显着地延迟在显示器上打印内容?
发布于 2018-09-30 19:06:18
不,你的理解不对。“终端仿真器”不涉及,至少不直接涉及。
输出缓冲区驻留在流对象本身内(本例中为std::cout
)。根据流的缓冲策略,使用此缓冲区有三种可能的方式:
'\n'
)时,缓冲区也会被刷新。打开文件时,流将开始被块缓冲。std::cerr
没有缓冲。如果输出转到终端,而块被缓冲,则std::cout
是行缓冲的。
std::flush
会立即刷新输出缓冲区(如果有)。
至于数据是如何编写的,细节取决于您的操作系统。在unix系统上,有一个名为write
的系统调用(“系统调用”是对操作系统执行某些操作的请求)。系统调用通常比正常函数调用慢;输出缓冲区是性能优化,因为您不想对输出的每个字符调用write
。在内部收集输出,直到需要编写更大的文本为止,这意味着对write
的调用减少,这意味着更好的整体性能。
至于你的具体问题:
std::cout
。https://stackoverflow.com/questions/52581080
复制相似问题