据我了解,默认情况下,C++ 支持的所有流 IO 都会被缓冲。
这意味着要输出的数据被放入缓冲区,直到缓冲区满,然后发送到输出设备,类似地,对于输入,一旦缓冲区为空,就会读取数据......所有这些都完成了,这样就减少了昂贵的系统数量可以尽量减少通话次数。
但如何在行动中验证这种行为。我的意思是考虑下面的代码
int main()
{
cout << "Hello world\n";
return 0
}
缓冲在哪里出现?我知道有缓冲发生,但如何解释呢?输出会立即在屏幕上看到,那么实际查看缓冲 I/O 的代码示例是什么?
首先,并不是所有的iostream都被缓冲;缓冲由附加的处理streambuf
。如果是filebuf
(由ifstream
and
ofstream
),输入将读取尽可能多的内容,直到大小
缓冲区,并且输出将在溢出时刷新缓冲区,当
显式刷新或关闭发生,或者当对象被破坏时(其中
隐式调用 close)。
的情况下cout
有点特别,因为它永远不会被破坏,也不会
关闭。有系统保证flush
将
之后至少调用过一次exit
被称为(这就是发生的事情
当你从main
)。这意味着之前的任何输出
从 main 返回将被刷新;如果你正在使用cout
在
静态对象的析构函数,您仍然需要显式刷新
当然。
也可以tie
输出流到输入流;cout
与cin
默认情况下。在这种情况下,任何尝试输入
绑定的流将刷新输出。
通常的约定是只使用std::endl
而不是简单地
输出'\n'
; std::endl
输出一个'\n'
然后冲洗
溪流。对于所有输出都出现非常重要的流
立即,有一个unitbuf
可以设置的标志,这意味着
该流将在每个结束时被刷新<<
操作员。
(std::cerr
默认情况下有此设置。)
最后,如果你想看到缓冲的效果,输入类似sleep(10)
在你的输出之后。如果立即出现输出,则已
酡;如果没有,则已被缓冲,并且发生刷新
隐含地在sleep
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)