缓冲区刷新在 C++ 中意味着什么?

1,244 阅读2分钟

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

缓冲区刷新是将计算机数据从临时存储区域传输到计算机的永久内存。例如,如果我们对文件进行任何更改,我们在一台计算机屏幕上看到的更改会临时存储在缓冲区中。 

通常,当我们打开任何 word 文档时,临时文件就会存在,并在我们关闭主文件时自动销毁。因此,当我们保存我们的工作时,自上次保存以来我们对文档所做的更改将从缓冲区刷新到硬盘上的永久存储。

在 C++ 中,我们可以显式刷新以强制写入缓冲区。通常,std::endl函数通过插入换行符并刷新流来工作。stdout/cout 是行缓冲的,即在您编写换行符或显式刷新缓冲区之前,输出不会发送到操作系统。例如

// 只写入一次底层文件而不是 5 次,这对性能来说要好得多。
std::cout << a << " + " << b << " = " << std::endl;

但是有一定的缺点,比如, 

// 下面是C++程序
#include <iostream>
#include <thread>
#include <chrono>

using namespace std;

int main()
{
for (int i = 1; i <= 5; ++i)
{
	cout << i << " ";
	this_thread::sleep_for(chrono::seconds(1));
}
cout << endl;
return 0;
}
上面的程序会一次性输出 1 2 3 4 5

因此,在这种情况下,会使用额外的 “刷新” 功能来确保根据我们的要求显示输出。例如,

// C++程序演示flush函数的使用
#include <iostream>
#include <thread>
#include <chrono>
using namespace std;
int main()
{
for (int i = 1; i <= 5; ++i)
{
	cout << i << " " << flush;
	this_thread::sleep_for(chrono::seconds(1));
}
return 0;
}
上面的程序将打印 
数字(1 2 3 4 5)一个一个而不是一次。 
原因是刷新功能刷新了输出 
立即到文件/终端。

笔记: 

  1. 你无法在在线编译器上运行该程序来查看差异,因为它们仅在程序终止时才提供输出。因此,您需要在 GCC 或 clang 等离线编译器中运行上述所有程序。
  2. 读取 cin 会刷新 cout,因此我们不需要显式刷新来执行此操作。