为什么有堆栈和堆?
为什么汇编语言同时使用堆栈和堆? 他们似乎多余。
它们不是多余的。 他们每个人都有优点和缺点:如果使用正确的话,栈的速度会更快,因为内存分配是微不足道的(push / pop)。 缺点是只能添加和删除顶部的项目(因此名称,堆栈)。 另外,总的堆栈空间是有限的,当你用完时,你有一个......好吧,堆栈溢出。 相比之下,堆允许随机分配和释放,并且您可以在那里存储大量数据,但缺点是分配会带来更多开销 - 对于每个分配的内存块,都必须找到合适的空闲部分,并且在长期运行,需要避免自由空间的碎片化,系统必须跟踪空闲块的位置。
您可以使用堆栈来传递短暂的小值,例如本地计数器变量,函数参数,返回值等。 这些都适合推/分配风格。 对于较大或较长寿命的数据结构,可以使用堆。
你当然可以构建一个计算系统,利用它们中的任何一个作为其唯一的内存模型。 但是,它们都有各自不同的特性,各有其优缺点。 大多数系统都利用两者来从每个系统中获益。
堆栈
一个堆栈可以被认为是一堆盘子,你在盘子上写下一个值并将其放在堆栈的顶部,这被称为推送操作并将值存储在堆栈上。 您显然也可以从堆栈中移除顶盘,这称为弹出式操作。 但新的分配必须始终位于堆栈顶部。
该堆栈倾向于用于局部变量并在函数之间传递值。 通常堆栈具有以下可怕的属性:
堆栈的问题来自于事实上只能从堆栈顶部添加/移除项目。 现在,当通过函数调用向上和向下遍历时,这是非常有意义的:从堆栈输入pop函数,为堆栈中的局部变量分配空间,运行函数,清除堆栈顶部的局部变量并将返回值压入堆栈。 另一方面,如果我想分配一些内存并将其传递给另一个线程,或者通常将它从远离它的位置突然释放,我有一个问题,当我想要堆栈时,堆栈不在正确的位置释放内存。
你可以说堆栈便于快速顺序分配内存。
堆
现在堆是不同的,每个分配通常是分开跟踪的。 这会导致大量的分配和释放开销,但是每一个都可以独立于其他内存分配进行处理,直到内存不足。
有很多算法可以实现这一点,在这里关于它们可能有点不明智,但这里有一个链接,讲述了一些简单的堆分配算法:malloc和new的替代方法
所以这个堆有利于随机内存分配,但是这带来了运行时间的损失,但是如果你只需要使用堆栈来处理这种情况,那么惩罚通常会很小。
它涉及内存处理和管理。 x86体系结构有不同类型的寄存器。 在x86架构上有硬件支持内存管理的可能性等等。
堆栈由指令指针使用,Heap用于某些应用程序中的数据段。
要阅读更多建议,请阅读以下链接:
“内存模型允许编译器执行许多重要的优化” - 维基百科
链接地址: http://www.djcxy.com/p/14005.html