我正在学习 C++,但我发现了一些我无法理解的东西:
可以显式刷新输出缓冲区以强制写入缓冲区。默认情况下,读取
cin
刷新cout
;cout
程序正常结束时也会刷新。
所以刷新缓冲区(例如输出缓冲区):这是通过删除缓冲区中的所有内容来清除缓冲区,还是通过输出其中的所有内容来清除缓冲区?或者刷新缓冲区是否意味着完全不同的东西?
考虑写入文件。这是一项昂贵的操作。如果在您的代码中一次写入一个字节,那么每次写入一个字节将非常昂贵。因此,提高性能的一种常用方法是将正在写入的数据存储在临时缓冲区中。只有当有大量数据时才将缓冲区写入文件。通过推迟写入,一次写入一个大块,性能得到了提高。
考虑到这一点,刷新缓冲区是将数据从缓冲区传输到文件的行为。
这是通过删除缓冲区中的所有内容来清除缓冲区,还是通过输出缓冲区中的所有内容来清除缓冲区?
后者。
你引用了答案:
可以显式刷新输出缓冲区以强制写入缓冲区。
也就是说,您可能需要“刷新”输出以将其写入底层流(可能是一个文件,或者在列出的示例中,一个终端)。
通常,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;
通过输出所有内容来清除缓冲区。