什么时候输出缓冲区冲洗?

时间:2013-11-10 20:12:09

标签: c++ c

除了手动调用flush之外,coutSTDOUT(printf)会刷新的条件是什么?

退出当前范围或当前功能?是时候定时吗?缓冲区已满时刷新(缓冲区有多大)?

1 个答案:

答案 0 :(得分:2)

对于<stdio.h>流,您可以使用setvbuf()设置缓冲模式。它需要三种缓冲模式:

  1. _IOFBF:当缓冲区已满或明确请求刷新时刷新缓冲区。
  2. _IOLBF:当找到换行符,缓冲区已满或请求刷新时,刷新缓冲区。
  3. _IONBF:流是无缓冲的,即输出会尽快发送。
  4. 我有impressino,stdout的默认设置为_IOLBFstderr的默认设置为_IONBF,其他流的默认设置为_IOFBF。但是,查看C标准,我没有找到任何关于任何C流的默认值的指示。

    对于标准C ++流对象,不等同于_IOLBF:如果你想要行缓冲,你可以使用std::endl,或者最好使用'\n'std::flush。但std::ostream有一些设置:

    1. 您通常可以使用buf.pubsetbuf(0, 0)将流转为无缓冲。由于流缓冲区可以由用户实现,因此不能保证相应的设置缓冲区的调用能够得到尊重。
    2. 您可以设置std::ios_base::unitbuf,这会导致在每次[正确实现]输出操作后刷新流。默认情况下,std::ios_base::unitbuf仅设置为std::cerr
    3. 当缓冲区已满或明确请求时std::ostream刷新缓冲区的正常设置,遗憾的是,std::endl发出明确请求以刷新缓冲区(在许多情况下会导致性能问题)因为它往往被用作'\n'的替代品,但它不是。{/ li>
    4. 一个有趣的是能够in.tie()输出缓冲区到输入流的能力:如果in.tie()包含指向std::ostream的指针,则此输出流将在尝试之前被刷新从in读取(假设正确实现了输入操作符,当然)。默认情况下,std::couttie() d至std::cin
    5. 几乎忘记了一个重要问题:如果std::ios_base::sync_with_stdio()未使用false调用标准C ++流(std::cinstd::coutstd::cerr和{{ 1}}和他们的std::clog对应物)可能完全无缓冲!使用wchar_t的默认设置,可以以混合方式使用标准C和C ++流。但是,由于C库通常无视C ++库,这意味着C ++标准流对象无法进行任何缓冲。使用std::ios_base::sync_with_stdio(true) 标准C ++流对象的主要性能问题!
    6. 在C和C ++中都无法控制缓冲区的大小:允许忽略设置非零缓冲区的请求,通常会被忽略。也就是说,流几乎会在一些随机的地方刷新。