为什么内存分成堆栈和堆?

可能重复:
什么和堆栈和堆在哪里

我在堆栈和堆上有几个问题。

要知道的基本知识是栈比堆快,但是有限。 (如我错了请纠正我)。

但是,我总是想知道栈和堆的工作原理。 RAM只是一块内存,它不会被分成'堆栈'和'堆'(或者它是什么?)。 如果是这样, 为什么我们将内存分成堆栈和堆栈呢?

操作系统可以让我们能够分配堆栈中的所有东西 - >一切都会更快 - >快乐的世界?

我很确定情况并非如此。 但为什么!? 任何人都可以给我一个深入的答案吗?

很抱歉,如果这篇文章是某人曾经发表过的帖子的重复,那么堆栈和堆的相关性如此之高,我找不到确切的问题。 如果你碰巧知道一个,请继续并链接它。


堆栈:堆栈用作当前正在执行的代码块以及任何称为当前块的块,以及称为该块的任何块的临时暂存区,依此类推。 当前块存在时,它所使用的局部变量被遗忘。 正如名称所示,堆栈以后进先出的方式使用。

该堆栈最重要的用途之一是跟踪当前的呼叫链。 当一个函数调用另一个函数时,调用者将下一条指令的地址(返回地址)推入堆栈。 当每个函数退出时,它会将其调用者的返回地址从堆栈中弹出,并继续执行从该地址开始的代码。 它也用于在调用者和被调用者之间传递函数参数和返回值。

堆:堆是不同的 - 没有特定的顺序。 如果你想在一段代码中分配内存,并让该内存超出块的末尾,你可以将它分配到堆上。 当然,您还需要在某处存储指针/引用,以便其他代码可以找到该内存; 大多数语言提供住宿。

速度:速度的差异并不是由于内存本身的任何属性 - 正如你在你的问题中所说的那样,堆栈和堆栈通常都在相同的物理内存中。 在堆栈中分配空间很快,原因在于堆栈的LIFO性质:如果将某些东西压入堆栈,只能有一个地方结束。 相比之下,在堆上分配块需要在内存中找到足够大的连续空闲区域。 堆栈分配可以像单条指令一样快; 堆分配需要调用像malloc()这样的内存分配函数。

静态与动态:在堆上分配内存是动态的 - 是否分配块以及块的大小可以根据程序在运行时接收的输入来确定。 在堆上分配的内存区域甚至可以根据需要调整大小。 也可以在堆栈上动态分配内存(请参阅C标准库函数alloca() ),但是当前函数退出后内存将立即丢失。 堆栈分配通常是静态的 - 编译器确定(非注册)参数,返回数据和本地变量需要多少空间,并且在调用该函数时生成代码以在堆栈中保留必要的空间。

示例:假设您正在创建一个文字处理器。 您无法提前知道文档的大小,甚至可能同时使用多少个文​​档。 与此同时,只要用户想让它们保持打开状态,就希望用户的文档保留在内存中。 如果您尝试为堆栈中的文档分配内存,您会发现很难一次打开多个文档,并且您需要创建一个创建,编辑,保存和关闭文档的函数。 在堆上分配空间允许您创建尽可能多的文档,每个文档都根据其包含的数据进行适当的大小设置,并避免将文档的生命周期与任何特定功能的生命周期挂钩。

简介:简而言之,堆栈保存变量的值(有时使用寄存器),而堆用于分配将在当前块的生命周期之外使用的内存。


您不仅可以使用堆栈,因为堆栈需要后进先出分配和解除分配顺序(即,您只能取消分配最新分配的数据;在堆栈中,您不能取消分配一些旧数据并保留一些新数据)。

其实,你可以摆脱堆栈(只保留堆)。 请参阅Appel的论文垃圾收集可以比堆栈分配更快,并且可以使用Continuation书进行编译。

堆没有明确的含义(除了“不在堆栈中的动态分配的内存”)。 实际上,在Linux系统上,使用mmap系统调用分配一大块内存相当快(但malloc实现尝试避免mmap并更喜欢重复使用free -d内存)。 问题是分配小内存区域。

并阅读更多关于垃圾收集技术。 在C或C ++中,您可以使用Boehm的GC

堆栈通常很有用,特别是对于递归函数调用。 它非常有用(例如在C中)今天的处理器通常具有专用的堆栈指针寄存器(由CALL&RET机器指令用于调用和返回)。 但情况并非总是如此; 在一些处理器(例如IBM360)上,堆栈指针是一个传统的寄存器,而不是硬编码的。

另请参阅这个&关于虚拟地址空间的答案(和其他答案)。


两者的内存都是一样的,但堆栈和堆是两种不同的数据结构,可用于不同的目的。

堆栈是任何微处理器为了在一对操作数(通常是处理器寄存器或存储器地址)上执行指令所需要的非常原始的抽象。

堆是一个通用的分配内存区域,通常你希望存储未绑定到堆栈的数据,也就是说,如果它们存储在堆栈中,它们的生存时间会更长,或者换言之,数据将按不同的方式访问部分代码。

链接地址: http://www.djcxy.com/p/2253.html

上一篇: Why is memory split up into stack and heap?

下一篇: Stack Memory vs Heap Memory