冲洗缓冲区是什么意思

What does flushing the buffer mean?

本文关键字:意思 是什么 缓冲区      更新时间:2023-10-16

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

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

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

考虑写入文件。这是一项昂贵的手术。如果在代码中一次写入一个字节,那么每次写入字节的成本将非常高。因此,提高性能的一种常见方法是将正在写入的数据存储在临时缓冲区中。只有当有大量数据时,缓冲区才会写入文件。通过推迟写入,并一次性写入一个大的块,可以提高性能。

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

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

后者。

您已经引用了答案:

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

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

通常,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;

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