我对缓冲区的理解正确吗?

Posted

技术标签:

【中文标题】我对缓冲区的理解正确吗?【英文标题】:Is my understanding of a buffer correct? 【发布时间】:2018-01-03 08:13:23 【问题描述】:

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

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

【问题讨论】:

缓冲区是您临时放置东西的某个地方的总称。几乎就是它的全部内容。 C++ 中没有标准的内存缓冲区抽象,如果这就是你的意思的话 缓冲区并不一定意味着数据以更好/更易于访问的格式存储。它是在内存中临时保存数据的东西,可能用于处理或写入磁盘。 【参考方案1】:

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

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

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

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

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

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

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

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

【讨论】:

以上是关于我对缓冲区的理解正确吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算帧缓冲区间距?

OpenGL顶点缓冲区不正确的渲染

recvfrom()的一次调用只能返回一个UDP包。此种说法正确吗?

面试官:Redis中的缓冲区了解吗-

我们应该使用带有信号量的互斥量来进行正确的同步并防止竞争条件吗?

关于java的io读写,缓冲区是如何提高读写效率的???