刷新缓冲区是什么意思?


95

我正在学习C ++,但发现了一些我听不懂的东西:

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

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

Answers:


122

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

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

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

后者。


1
谢谢。还有一件事。读cin可冲洗cout。这种“阅读cin”是指用户输入内容时还是提示用户输入内容时?
穆罕默德·艾哈迈德·纳比尔

4
当您使用流运算符从cin读取时,会读取cin。通常,您在阅读时要刷新cout,因为否则输入可能会出现在提示之前。
David Heffernan

1
@DavidHeffernan据我所知,您无需在cin之前冲洗cout,因为cin和cout是绑定的(Stroustrup,C ++编程语言,[io.tie])。
sturmer

24

您已引用答案:

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

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

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

为此(int i = 0; i <5; i ++){std :: cout <<“。”; 睡眠(1); } std :: cout << std :: endl; 不会一次打印.....。它在1毫秒之间打印它们。使用sleep(1000)时,您会注意到更多
Mohamed Ahmed Nabil 2013年

@MohamedAhmedNabil sleep()(POSIX)与Sleep()(Windows)
tc

1
答案是旧的,但评论很少,内容更多,示例更多。您cout使用名称空间(即std::cout)进行了限定,但对于而言则没有endl,这也需要该限定。
vol7ron

1
我喜欢你的榜样。但是我认为endl会刷新缓冲区,但是在您的示例中,\ n会刷新缓冲区。我很困惑。
Naz

1
@Naz \ n不刷新缓冲区;在他的示例中,缓冲区仅在程序末尾刷新(缓冲区总是在C ++程序末尾自动刷新)。\ n可能只是用于格式化。同样,您正确的是std :: endl刷新缓冲区(std :: flush也是如此,但这是不言自明的)。
liamnickell '17

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.