【问题标题】:When does the buffer flush缓冲区何时刷新
【发布时间】:2015-08-10 15:48:31
【问题描述】:

对于cpp,我知道我们有三种情况来刷新缓冲区:

  1. 当我们得到std::cin
  2. 当我们std::cout<<std::endl(或其他类似endl)时
  3. 当我们调用像fflush这样的函数时

如果我是对的,有一个问题:
如果我只是在main 中写std::cout<<"hello world"; 并运行它,我可以在控制台上看到“hello world”。那么,缓冲区由谁以及何时刷新?由编译器?或者当 main 完成时缓冲区会刷新?

【问题讨论】:

  • 当缓冲区填满或程序退出时。
  • 当调用流析构函数时。
  • 缓冲区应该在程序退出前刷新。
  • @ivanw 你确定吗?
  • 是的,程序必须将内存释放回操作系统。

标签: c++ buffer cout flush


【解决方案1】:

您可能想了解std::unitbufstd::nounitbuf。这是一个不错的reference

玩一些简单的例子可能会有所帮助。例如,下面的代码永远不会打印Hello world,因为在任何输出操作之后都不会自动刷新输出流:

示例 1

#include<iostream>

int main()
{
    // ----- Don't want automatic flushing ------
    std::cout << std::nounitbuf;
    std::cout << "Hello world";

    while (1)
    {
        ;
    }
}

而且这个代码示例确实会打印Hello world,因为我指定了我希望启用自动刷新:

示例 2

#include<iostream>

int main()
{
    // ----- I do want automatic flushing ------
    std::cout << std::unitbuf;
    std::cout << "Hello world";

    while (1)
    {
        ;
    }
}

我知道无限 while 循环看起来有点傻,但它是我现在能想到的最简单、最便携的暂停代码的方法(不过我相信还有更好的方法!)。这样我就不会因为(1)代码终止,(2)被调用的析构函数和(3)等等而被刷新。这完全取决于std::cout 的属性。

【讨论】:

    【解决方案2】:

    同样的问题,我做了一个小测试

    int main() {
        printf("t");
        // fflush(stdout);
        while(1);
        return 0;
    }
    

    似乎没有fflush,什么都不会打印出来。 随着同花顺,我的小“t”出现在控制台上。

    所以,加上前面的响应,我相信刷新不会神奇地发生,而是在各种“事件”的帮助下发生,例如程序退出时,或者缓冲区已满时。

    This answer帮助我理解了很多。

    【讨论】:

      猜你喜欢
      • 2018-07-11
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      相关资源
      最近更新 更多