缓冲区是什么?

10

就我对编程语言的理解,缓冲区是存储数据的任何内存部分,例如int、float变量、字符数组等。

然而,在了解缓冲区溢出时,我阅读关于堆栈的内容时发现了这个链接http://www.tenouk.com/Bufferoverflowc/Bufferoverflow2a.html。链接中的图将缓冲区与函数的局部变量分开。那么缓冲区到底是什么呢?


1
缓冲区是那个人,给我的车清洁和抛光 :) 但说真的,在http://en.wikipedia.org/wiki/Data_buffer上有很多好的例子。 - nas
7个回答

4
非常抽象的比喻:局部变量就像你现在正在处理的东西;它们就像你手里拿着的东西一样。缓冲区类似于数据源中的勺子,或者是水龙头中的量杯。手里拿勺子比手里拿碗更实用,而手里拿流动的水几乎是不可能的。无论哪种情况,你都使用这些工具以便以适合你自己的速度来消耗汤/水。
更具体地说,局部变量只是你在函数内部声明的变量,与在外部声明的变量相对。缓冲区是一块内存(通常是一个数组),用于从大型数据源中复制小块数据,以便你可以按照计算机或程序能够处理的速度进行处理。如果你想让另一个函数填充缓冲区,可以在函数外部声明缓冲区,或者如果你要自己填充和使用它,则可以将其声明为局部变量。它是一个非常通用的术语。
一些例子:
- 音频缓冲区可以容纳约0.5秒的音频,以从声卡复制到程序的内存中进行处理,或从程序的内存复制到声卡以输出到扬声器。如果程序立即解码mp3文件并将所有数据倒入您的声卡,那么它将变成数百MB的大小,而您不会享受以50倍速度听音乐——所以它只是逐步解码,并将其存储在缓冲区中。 - 视频缓冲区可能会在您开始观看视频时从YouTube中填充到您的内存和/或硬盘中,以便您不会因为互联网连接过慢而每隔几秒钟就暂停。 - 程序可能使用字符缓冲区来在一个函数和另一个函数之间共享一些文本。如果你使用cin或ReadLine或gets之类的东西从键盘获取一些文本输入,可以把它存储在一个“字符缓冲区”中。在这种情况下,你会将缓冲区声明为局部变量。

2
据我理解,缓冲区是指内存中的任何一部分,用于存储数据,例如int、float变量,字符数组等等。

当然,并非所有的变量都被存储在缓冲区中,否则这个术语就没有意义了。

缓冲区是从一个地方到另一个地方传输数据时所使用的临时存储区域。通常缓冲区能够容纳比单个变量更多的数据,但也有一些特殊情况下缓冲区相对较小。

本地变量可以用作缓冲区,这样会在堆栈上分配它,但由于缓冲区通常很大,占用大量栈空间将不切实际,因此它们通常在其他地方分配。

缓冲区的一种应用场景是,在程序从文件读取数据时。在较低层次上,磁盘只能按扇区进行读取,因此系统会将一组扇区读入缓冲区,然后程序从缓冲区读取。


1
在您链接的页面上,将“缓冲区”视为“我们关心的唯一本地变量”,将“本地声明变量”视为“所有本地声明的不是缓冲区的变量”。

0

不要太字面理解那个图表。你的第一个定义是正确的。那个缓冲区可以是一个局部变量,也可以在堆上或其他内存区域中...它是一个非常通用的概念。


0
根据维基百科
在计算机中,缓冲区是用于在数据从一个地方移动到另一个地方时临时存储数据的内存区域。通常情况下,在数据从输入设备(如键盘)检索到之后,或者在发送至输出设备(如打印机)之前,数据会被存储在缓冲区中。但是,在计算机内部的进程之间移动数据时,也可以使用缓冲区。这类似于电信中的缓冲区。缓冲区可以在硬件或软件中实现,但大多数缓冲区都是在软件中实现的。在数据接收速率与处理速率之间存在差异,或者当这些速率是可变的时候,例如在打印机缓冲池或在线视频流中,通常使用缓冲区。
通常,这种情况下的缓冲区将是包含许多字节数据的数组,而不是像只能容纳单个值的整数这样的变量。

0
一个缓冲区只是用于存储任意数据的内存块。在这个图示中,我认为“缓冲区”是指声明为局部变量的缓冲区,例如 char myString[80];。危险在于,如果未严格监测放入此缓冲区的数据长度,您可能会将一些数据复制到缓冲区并溢出到末尾 - 在这一点上,保存的寄存器将被破坏,从函数返回可能(并几乎肯定)会造成破坏。

0

它只是一个分配的内存块,可以暂时保存任意数据。需要记住的是,如果您分配了一块内存,请确保在完成后释放它,以防止发生溢出和其他意外行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接