Memory 为什么会有一堆和一堆?

Memory 为什么会有一堆和一堆?,memory,stack,heap,allocation,Memory,Stack,Heap,Allocation,为什么汇编语言同时使用堆栈和堆?它们似乎是多余的。这是关于内存处理和管理的。 x86体系结构有不同类型的寄存器。 在x86体系结构上有硬件支持的内存管理的可能性,等等 堆栈由指令指针使用,堆在某些应用程序中用于数据段 要阅读更多信息,请阅读以下链接: “内存模型允许编译器执行许多重要的操作 优化”-维基百科 它们不是多余的。它们各有优缺点:如果使用得当,堆栈会更快,因为内存分配很简单(push/pop)。缺点是您只能在顶部添加和删除项(因此名为stack)。此外,总堆栈空间是有限的,当您

为什么汇编语言同时使用堆栈和堆?它们似乎是多余的。

这是关于内存处理和管理的。 x86体系结构有不同类型的寄存器。 在x86体系结构上有硬件支持的内存管理的可能性,等等

堆栈由指令指针使用,堆在某些应用程序中用于数据段

要阅读更多信息,请阅读以下链接:

“内存模型允许编译器执行许多重要的操作 优化”-维基百科


它们不是多余的。它们各有优缺点:如果使用得当,堆栈会更快,因为内存分配很简单(push/pop)。缺点是您只能在顶部添加和删除项(因此名为stack)。此外,总堆栈空间是有限的,当您用完时,您有一个。。。嗯,堆栈溢出。相比之下,堆允许随机分配和释放,您可以在那里存储大量数据,但缺点是分配会带来更多开销-对于每个分配的内存块,必须找到合适的空闲部分,从长远来看,需要避免空闲空间的碎片化,系统必须跟踪空闲块的位置


使用堆栈传递小的短期值,例如局部计数器变量、函数参数、返回值等。;它们适合于推送/弹出式分配方式。对于较大或长寿命的数据结构,您可以使用堆。

您当然可以构建一个计算系统,使用其中任何一个作为其唯一的内存模型。然而,它们都有相当不同的性质,各有其优缺点。大多数系统都使用这两种方法,以便从每种方法中获得好处

堆栈

堆栈可以看作是一堆板,你在板上写一个值,然后把它放在堆栈的顶部。这称为推操作,并在堆栈上存储一个值。显然,您也可以从堆栈中移除顶板,这称为pop操作。但新的分配必须始终位于堆栈的顶部

堆栈通常用于局部变量和在函数之间传递值。通常,堆栈具有以下特性:

  • 只需要少量指针即可管理
  • 非常容易在硬件中实现,大多数处理器都内置了对堆栈的硬件支持,使其速度更快
  • 非常快速地分配内存
堆栈的问题来自这样一个事实:项目只能从堆栈顶部添加/删除。现在,在上下遍历函数调用时,这非常有意义:从堆栈中弹出函数输入,为堆栈上的局部变量分配空间,运行函数,从堆栈顶部清除局部变量,并将返回值推送到堆栈上。另一方面,如果我想分配一些内存,并说将其传递给另一个线程,或者通常在远离分配位置的地方释放内存,那么突然出现问题,当我想释放内存时,堆栈的位置不正确

可以说,堆栈有助于快速顺序内存分配

现在堆不同了,每个分配通常是单独跟踪的。这会导致分配和解除分配的大量开销,但每个分配都可以独立于其他内存分配来处理,直到内存耗尽为止

有很多算法可以实现这一点,在twitter上谈论这些算法可能有点不明智,但这里有一个链接,介绍了一些好的简单堆分配算法:


因此,堆有助于随机内存分配,但这会带来运行时惩罚,然而,这种惩罚通常比仅使用堆栈处理情况所产生的惩罚要小。

虽然这是一个好问题,但已经回答了。。。还有一个类似的问题,重点是Windows,得到了回答(因为另一个是特定于操作系统的,我不打算投票关闭,但这是一个接近的决定)。