内存、缓冲区和堆栈有什么区别?

12

在学习 C 编程时,通常只提到了 memory,但实践中似乎还有更多;也会用到 bufferstack 这些术语。

这些术语之间有什么区别?它们的相关性是什么?

请提供详细的答案。简短的回答无法满足要求。一些资源可能会有所帮助。


根据您的要求,我不会将其作为答案,但简而言之,堆栈和缓冲区是内存中特定的位置。“堆栈”是函数堆栈,一种堆栈数据结构,用于保存所有本地变量。缓冲区可以在各种上下文中使用,通常它们存储临时数据,然后进行处理。 - ApproachingDarknessFish
您可能想说的是“堆”而不是“缓冲区”。前者始终与栈不同,而后者是一块内存。 - Eran
1
如果这个问题是7年前提出的,它会有大量的赞同,这个网站的虚伪令人惊讶。 - J3STER
2个回答

14

缓冲区在数据从一个地方移动到另一个地方的过程中,即从输入设备到输出设备时,可以暂存数据。你可以说缓冲区是内存的一部分。可以说,缓冲区是预先分配的内存区域,你可以在处理数据时将其存储在其中。

来自这里

另一方面,缓冲区主要位于RAM中,作为CPU可以临时存储数据的区域。当计算机和其他设备具有不同的处理速度时,主要使用此区域。通常情况下,检索自输入设备(如鼠标)的数据或发送到输出设备(如扬声器)之前将数据存储在缓冲区中。但是,在计算机内部移动数据时也可能使用缓冲区。

因此,计算机将数据写入缓冲区,从那里设备可以以自己的速度访问数据。这使得计算机能够在将数据写入缓冲区之后专注于其他事项,而不是不断关注数据,直到设备完成。

缓冲区可以通过硬件中的固定存储位置或使用软件中的虚拟数据缓冲区来实现,该虚拟数据缓冲区指向存储在物理存储介质上的数据缓冲区。大多数缓冲区在软件中使用。这些缓冲区通常使用更快的RAM来存储临时数据,因为RAM的访问时间比硬盘驱动器要快得多。缓冲区经常通过在内存中实现队列或FIFO算法来调整时间。因此,它通常以一定速率将数据写入队列并以另一种速率读取数据。

是一个项目集合,其中数据从一端插入和移除,称为栈顶。

在计算机科学中,栈是一种特殊的抽象数据类型或集合,其中集合上的主要(或唯一)操作是添加实体到集合中,称为"推入(push)",以及从集合中移除实体,称为“弹出(pop)”。


4
你在教@rullof如何使用互联网吗?;-) - Fiddling Bits
1
@FiddlingBits:当你看到像“请,我需要一个详细的答案。简短的回答无法解决问题。”这样的问题时,你别无选择。 ;) - Rahul Tripathi
@RahulTripathi 谢谢。对于缓冲区很擅长。对于堆栈,我知道LIFO原则是什么,但我不知道它与程序和处理有什么关系,需要了解的重要信息是什么。 - rullof
1
@rullof:虽然我没有很清楚地理解你的观点,但我可以告诉你,如果我没记错的话,编译器在检查if/else等内容时会使用堆栈。此外,编程语言中的命令,如递归方法调用,也会使用堆栈来为每个调用排序或确定优先级。 - Rahul Tripathi

3

内存是一个存储空间,用于存储关于程序的指令和数据。缓冲区和堆栈都是内存的小部分。

缓冲区在程序执行期间暂时存储数据。

操作系统概念(第8版):

缓冲区是存储在两个设备或设备与应用程序之间传输的数据的内存区域。

另一方面,堆栈是按照后进先出(LIFO)原则插入和删除对象的容器。在推入堆栈中,只允许两个操作:将项目推入堆栈,并从堆栈中弹出项目。堆栈是一种有限访问数据结构 - 只能在顶部添加和删除元素。push将项目添加到堆栈的顶部,pop从堆栈中删除项目。


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