什么是缓冲?

时间:2010-07-17 18:27:40

标签: buffer theory buffer-overflow

就我对语言的理解而言,缓冲区是内存的任何部分,其中数据的存储方式类似于int,float变量,字符数组等。 但是,我正在阅读缓冲区溢出并在阅读堆栈http://www.tenouk.com/Bufferoverflowc/Bufferoverflow2a.html时遇到此链接。此链接中的图表将缓冲区与函数的局部变量分开。它是否正确?什么是缓冲呢?

7 个答案:

答案 0 :(得分:4)

非常抽象的类比:局部变量就是你现在正在使用的东西;他们就是你手里拿着的东西。一个缓冲区是数据源,勺子是汤碗,或量杯是水龙头。握在你手中的勺子比手里拿着汤碗更实际,而且几乎不可能在你的手中握住流水。在任何一种情况下,您都在使用这些器具,以便您能够以适合您的速度饮用汤/水。

更具体地说,局部变量只是您在函数内声明的变量,而不是外部变量。缓冲区是一块内存(通常是一个数组),用于从大型数据源复制一小块数据,因此您可以按照计算机或程序可以处理的任何速度处理它。如果你想要另一个函数来填充它,你可以在你的函数之外声明缓冲区,或者如果你要填充它并自己使用它,你可以将它声明为局部变量。这是一个非常通用的术语。

一些例子:

  • 音频缓冲区可能会保存大约0.5秒的音频,从声卡复制到程序的存储器以供程序处理,或者从程序的存储器复制到声卡以输出到扬声器。你的程序可以立即解码一个mp3文件并将所有数据转储到你的卡上,但是如果这样做的话,它最终会达到几百MB的数量级,你不会喜欢以50倍的速度听音乐 - 因此它只是一点一点地解码,并将其存储在缓冲区中。
  • 当您启动视频时,视频缓冲区可能会从YouTube中填充到您的内存和/或硬盘中,这样您就不会每隔几秒就暂停,因为互联网连接速度太慢。
  • 程序可能会使用字符缓冲区将一个文本从一个函数共享到另一个函数。如果您使用cin或ReadLine或者从键盘获取某些文本输入,那么调用它存储在“字符缓冲区”中的字符串是公平的。在这种情况下,您将缓冲区声明为本地变量。

答案 1 :(得分:1)

在您链接到的页面上,将“Buffer”视为“我们关心的唯一局部变量”,并将“本地声明的变量”视为“所有本地声明的非缓冲变量”。 / p>

答案 2 :(得分:1)

  

据我所知   语言去,缓冲是任何   数据所在的内存部分   存储像int,float变量,   字符数组等。

好吧,不仅仅是任何数据,如果是这种情况,所有变量都将存储在缓冲区中,并且该术语毫无意义。

当数据来自一个地方并转移到另一个地方时,缓冲区就是您用于临时存储的东西。通常缓冲区比单个变量保存的要多得多,但当然特殊情况下缓冲区也很小。

局部变量可以用作缓冲区,因此可以在堆栈上分配,但由于缓冲区通常较大,因此占用大量堆栈空间是不切实际的,因此通常将它们分配到其他地方。 / p>

使用缓冲区的一个示例是当程序从文件中读取时。在较低级别,磁盘只能以扇区为单位读取,因此系统将一堆扇区读入缓冲区,然后程序从缓冲区读取。

答案 3 :(得分:0)

不要太过字面意思。你的第一个定义是正确的。该缓冲区可以是局部变量,也可以位于堆上或其他内存区域......这是一个非常普遍的概念。

答案 4 :(得分:0)

根据Wikipedia

  

在计算中,缓冲区是一个内存区域,用于在数据从一个地方移动到另一个地方时临时保存数据。通常,数据在从输入设备(例如键盘)检索时或者在将其发送到输出设备(例如打印机)之前存储在缓冲器中。但是,当在计算机内的进程之间移动数据时,可以使用缓冲区。这与电信中的缓冲区相当。缓冲区可以用硬件或软件实现,但绝大多数缓冲区都是用软件实现的。缓冲区通常在接收数据的速率与处理速率之间存在差异时使用,或者在这些速率可变的情况下使用,例如在打印机假脱机程序或在线视频流中。 / p>

通常,这种意义上的缓冲区是一个包含许多字节数据的数组,而不是一个只能容纳一个值的整数变量。

答案 5 :(得分:0)

buffer只是用于存储任意数据的内存块。在图中,我认为“缓冲区”旨在显示缓冲区,它被声明为局部变量,例如char myString[80];。危险在于,如果没有严格监控放入此缓冲区的数据长度,您可以例如strcpy(...)将一些数据放入缓冲区并溢出结尾 - 此时保存的寄存器将被踩踏,并且函数的返回可能(并且几乎肯定会)造成严重破坏。

答案 6 :(得分:0)

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