我对缓冲区的理解是否正确?

Is my understanding of a buffer correct?

我最近一直在学习缓冲区,我想检查一下我对它们的理解是否正确。我必须以二进制格式读入一个文件,这会产生一个字节序列。为了在我的程序中使用这些字节,我必须将它们存储在一个向量中,然后我可以遍历向量中的每个元素。

因此,缓冲区不是像向量这样的实际数据类型,而是以 better/more 可访问格式临时存储数据以便使用的东西。这个定义正确吗?我不认为这有什么区别,但我使用的语言是 C++。

我认为您适合这种特殊情况,您正在使用临时存储将字节读入内存,然后将其重塑为您的程序需要的实际数据格式。

但是:术语缓冲区在不同的上下文中用于许多事物。

例如,缓冲区可以是用于从文件读取到内存的内存,因此当源请求单个字符(或少量字节)时,运行时库不必去所有的进入 OS 内核以请求一个或少量字节,但会分摊一千字节或几千字节数据的开销。这通常隐藏在 C 或 C++ 运行时中。

在 C++ 中,std::stream 的内部实现使用 std::streambuf 来处理 file-I/O 的低级缓冲机制。

在其他情况下,当系统忙于做其他事情时,它会存储您的按键操作,直到应用程序有时间从键盘输入中读取。

同样,在屏幕上显示实际视频内容之前,有缓冲区可以从 Internet 读取视频流。因为如果视频播放器在使用时一次只请求几个字节,请求的开销会使播放非常不稳定。

另一个例子是应用程序使用 OpenCL(或 Cuda)在 GPU 上处理一些数据,并需要一些内存来存储数据,然后调用 clCreateBuffer(..., size, ...) 将返回一个内存对象存储 size 字节。

在计算机中还有许多其他地方使用术语缓冲区。 (在计算机以外的领域,例如化学[一种抵抗或有助于限制 pH 值变化的化合物] 和火车 ["bump stops" 在车厢末端]。