121

我正在学习 C++,但我发现了一些我无法理解的东西:

可以显式刷新输出缓冲区以强制写入缓冲区。默认情况下,读取cin刷新coutcout程序正常结束时也会刷新。

所以刷新缓冲区(例如输出缓冲区):这是通过删除缓冲区中的所有内容来清除缓冲区,还是通过输出其中的所有内容来清除缓冲区?或者刷新缓冲区是否意味着完全不同的东西?

4

3 回答 3

152

考虑写入文件。这是一项昂贵的操作。如果在您的代码中一次写入一个字节,那么每次写入一个字节将非常昂贵。因此,提高性能的一种常用方法是将正在写入的数据存储在临时缓冲区中。只有当有大量数据时才将缓冲区写入文件。通过推迟写入,一次写入一个大块,性能得到了提高。

考虑到这一点,刷新缓冲区是将数据从缓冲区传输到文件的行为。

这是通过删除缓冲区中的所有内容来清除缓冲区,还是通过输出缓冲区中的所有内容来清除缓冲区?

后者。

于 2013-02-23T16:42:04.677 回答
27

你引用了答案:

可以显式刷新输出缓冲区以强制写入缓冲区。

也就是说,您可能需要“刷新”输出以将其写入底层流(可能是一个文件,或者在列出的示例中,一个终端)。

通常,stdout/cout 是行缓冲的:在您写入换行符或显式刷新缓冲区之前,输出不会发送到操作系统。优点是类似的东西std::cout << "Mouse moved (" << p.x << ", " << p.y << ")" << endl只会导致对底层“文件”的一次写入而不是六次,这对性能来说要好得多。缺点是这样的代码:

for (int i = 0; i < 5; i++) {
    std::cout << ".";
    sleep(1); // or something similar
}

std::cout << "\n";

将立即输出.....(有关确切sleep实施,请参阅此问题)。在这种情况下,您将需要额外<< std::flush的以确保显示输出。

读取cin刷新cout,因此您不需要显式刷新来执行此操作:

std::string colour;
std::cout << "Enter your favourite colour: ";
std::cin >> colour;
于 2013-02-23T16:50:05.067 回答
5

通过输出所有内容来清除缓冲区。

于 2013-02-23T16:41:57.777 回答