buffer什么时候刷新

When does the buffer flush

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

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

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

您可能想阅读有关 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.

的属性

遇到同样的问题,做了个小测试

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

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

所以,添加到之前的响应中,我相信刷新不会神奇地发生,而是在各种"events"的帮助下发生,例如当程序退出时,或者当缓冲区已满时。

帮我理解了很多。