除了手动调用flush之外,cout
或STDOUT(printf)
会刷新的条件是什么?
退出当前范围或当前功能?是时候定时吗?缓冲区已满时刷新(缓冲区有多大)?
答案 0 :(得分:2)
对于<stdio.h>
流,您可以使用setvbuf()
设置缓冲模式。它需要三种缓冲模式:
_IOFBF
:当缓冲区已满或明确请求刷新时刷新缓冲区。_IOLBF
:当找到换行符,缓冲区已满或请求刷新时,刷新缓冲区。_IONBF
:流是无缓冲的,即输出会尽快发送。我有impressino,stdout
的默认设置为_IOLBF
,stderr
的默认设置为_IONBF
,其他流的默认设置为_IOFBF
。但是,查看C标准,我没有找到任何关于任何C流的默认值的指示。
对于标准C ++流对象,不等同于_IOLBF
:如果你想要行缓冲,你可以使用std::endl
,或者最好使用'\n'
和std::flush
。但std::ostream
有一些设置:
buf.pubsetbuf(0, 0)
将流转为无缓冲。由于流缓冲区可以由用户实现,因此不能保证相应的设置缓冲区的调用能够得到尊重。std::ios_base::unitbuf
,这会导致在每次[正确实现]输出操作后刷新流。默认情况下,std::ios_base::unitbuf
仅设置为std::cerr
。std::ostream
刷新缓冲区的正常设置,遗憾的是,std::endl
发出明确请求以刷新缓冲区(在许多情况下会导致性能问题)因为它往往被用作'\n'
的替代品,但它不是。{/ li>
in.tie()
输出缓冲区到输入流的能力:如果in.tie()
包含指向std::ostream
的指针,则此输出流将在尝试之前被刷新从in
读取(假设正确实现了输入操作符,当然)。默认情况下,std::cout
为tie()
d至std::cin
。std::ios_base::sync_with_stdio()
未使用false
调用标准C ++流(std::cin
,std::cout
,std::cerr
和{{ 1}}和他们的std::clog
对应物)可能完全无缓冲!使用wchar_t
的默认设置,可以以混合方式使用标准C和C ++流。但是,由于C库通常无视C ++库,这意味着C ++标准流对象无法进行任何缓冲。使用std::ios_base::sync_with_stdio(true)
标准C ++流对象的主要性能问题!在C和C ++中都无法控制缓冲区的大小:允许忽略设置非零缓冲区的请求,通常会被忽略。也就是说,流几乎会在一些随机的地方刷新。