我正在学习C ++,但发现了一些我听不懂的东西:
可以显式刷新输出缓冲区以强制写入缓冲区。默认情况下,读取
cin
冲洗cout
;cout
当程序正常结束时,也会刷新。
因此,刷新缓冲区(例如输出缓冲区):是通过删除缓冲区中的所有内容来清除缓冲区还是通过输出缓冲区中的所有内容来清除缓冲区?还是刷新缓冲区意味着完全不同?
我正在学习C ++,但发现了一些我听不懂的东西:
可以显式刷新输出缓冲区以强制写入缓冲区。默认情况下,读取
cin
冲洗cout
;cout
当程序正常结束时,也会刷新。
因此,刷新缓冲区(例如输出缓冲区):是通过删除缓冲区中的所有内容来清除缓冲区还是通过输出缓冲区中的所有内容来清除缓冲区?还是刷新缓冲区意味着完全不同?
Answers:
考虑写入文件。这是一个昂贵的操作。如果在您的代码中一次写入一个字节,那么每次写入一个字节将非常昂贵。因此,提高性能的常用方法是将要写入的数据存储在临时缓冲区中。仅当有大量数据时,缓冲区才会写入文件。通过推迟写入并一次性写入一个大块,可以提高性能。
考虑到这一点,刷新缓冲区是将数据从缓冲区传输到文件的行为。
这是通过删除缓冲区中的所有内容来清除缓冲区还是通过输出缓冲区中的所有内容来清除缓冲区?
后者。
您已引用答案:
可以显式刷新输出缓冲区以强制写入缓冲区。
也就是说,您可能需要“刷新”输出,以将其写入基础流(可以是文件,或在列出的示例中为终端)。
通常,stdout / cout是行缓冲的:除非您编写换行符或显式刷新缓冲区,否则输出不会发送到OS。优点是类似的操作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;
sleep()
(POSIX)与Sleep()
(Windows)
cout
使用名称空间(即std::cout
)进行了限定,但对于而言则没有endl
,这也需要该限定。