Memory management 堆栈是如何工作的?

Memory management 堆栈是如何工作的?,memory-management,stack,heap-memory,Memory Management,Stack,Heap Memory,我有几个关于堆栈的问题。关于堆栈,有一件事我不明白,那就是流行和推送的想法。假设我有一个整数a和b,a在b的上面。按照我的理解,要访问b,a必须从堆栈中弹出才能访问b。那么,当从堆栈中弹出时,存储在哪里呢 另外,如果堆栈内存的访问效率高于堆内存,那么为什么堆内存的结构不像堆栈?谢谢 我不是一个专家,但你可以把它想象成拼图。要访问较低的光盘,您可以将光盘弹出到其上方,然后将其放在其他位置—在本例中,放在其他堆栈上,但在编程的情况下,它可能只是一个简单的变量或指针或任何东西。当你得到了你需要的物品后

我有几个关于堆栈的问题。关于堆栈,有一件事我不明白,那就是流行和推送的想法。假设我有一个整数a和b,a在b的上面。按照我的理解,要访问b,a必须从堆栈中弹出才能访问b。那么,当从堆栈中弹出时,存储在哪里呢


另外,如果堆栈内存的访问效率高于堆内存,那么为什么堆内存的结构不像堆栈?谢谢

我不是一个专家,但你可以把它想象成拼图。要访问较低的光盘,您可以将光盘弹出到其上方,然后将其放在其他位置—在本例中,放在其他堆栈上,但在编程的情况下,它可能只是一个简单的变量或指针或任何东西。当你得到了你需要的物品后,其他物品可以放回堆栈或完全移到其他地方。

我不是专家,但你可以像猜谜一样思考这个问题。要访问较低的光盘,您可以将光盘弹出到其上方,然后将其放在其他位置—在本例中,放在其他堆栈上,但在编程的情况下,它可能只是一个简单的变量或指针或任何东西。当您得到所需的物品后,其他物品可以放回堆栈或完全移到其他地方。

a存储在您决定存储的任何位置。:-您需要提供一个变量,在移除时将值存储在堆栈a的顶部,然后移除下一项b并将其存储在另一个变量中以使用它,然后将第一个值a推回到堆栈上

想象一下,你左边的柜台上有一堆脏盘子。你拿起一个来洗,把它从脏堆里弹出来,洗干净,晾干,然后把它放在干净堆的顶部,把它推到你的右边

如果你想从任何一个堆叠的顶部到达第二个板块,你必须移动顶部的板块才能到达。所以你把它捡起来,弹出来,暂时放在某个地方,拿起下一个盘子,弹出来,放在某个地方,然后把你取出的第一个盘子放回堆上,把它推回到堆上

如果你不能用盘子来描绘它,那就用一副真正的扑克牌或棒球牌,或者一堆纸——任何你能整齐地叠起来放在左手桌子上的东西。然后执行我最后一段中的步骤,用卡片替换字牌并实际执行这些步骤

因此,要访问b,您需要声明一个变量来存储a,弹出a并将其保存在该变量中,将b弹出到它自己的变量中,然后将a推回到堆栈中。

a存储在您决定存储它的任何位置。:-您需要提供一个变量,在移除时将值存储在堆栈a的顶部,然后移除下一项b并将其存储在另一个变量中以使用它,然后将第一个值a推回到堆栈上

想象一下,你左边的柜台上有一堆脏盘子。你拿起一个来洗,把它从脏堆里弹出来,洗干净,晾干,然后把它放在干净堆的顶部,把它推到你的右边

如果你想从任何一个堆叠的顶部到达第二个板块,你必须移动顶部的板块才能到达。所以你把它捡起来,弹出来,暂时放在某个地方,拿起下一个盘子,弹出来,放在某个地方,然后把你取出的第一个盘子放回堆上,把它推回到堆上

如果你不能用盘子来描绘它,那就用一副真正的扑克牌或棒球牌,或者一堆纸——任何你能整齐地叠起来放在左手桌子上的东西。然后执行我最后一段中的步骤,用卡片替换字牌并实际执行这些步骤

所以要访问b,您需要声明一个变量来存储a,弹出a并保存在该变量中,将b弹出到它自己的变量中,然后将a推回到堆栈中

那么,当从堆栈中弹出时,存储在哪里呢

视情况而定。它去读取堆栈的程序决定的地方。它可以存储值、忽略值、打印值或其他任何内容

另外,如果堆栈内存的访问效率高于堆内存,为什么 堆内存的结构不是像堆栈一样吗

堆栈的访问效率并不比堆高,这取决于使用情况。程序的流程变得越来越深,越来越浅,就像堆栈一样。在主流语言中,局部变量、参数和返回地址存储在堆栈结构中,因为这种结构更容易实现我们称之为函数堆栈框架的语义。函数可以非常有效地访问自己的堆栈帧,但不一定访问调用函数的堆栈帧,即整个堆栈

另一方面,如果以这种方式实现,堆将效率低下,因为人们期望堆能够访问并可能删除任何位置的项,而不仅仅是从其顶部/底部

那么,当从堆栈中弹出时,存储在哪里呢

视情况而定。它去的地方程序是r 读取堆栈决定。它可以存储值、忽略值、打印值或其他任何内容

另外,如果堆栈内存的访问效率高于堆内存,为什么 堆内存的结构不是像堆栈一样吗

堆栈的访问效率并不比堆高,这取决于使用情况。程序的流程变得越来越深,越来越浅,就像堆栈一样。在主流语言中,局部变量、参数和返回地址存储在堆栈结构中,因为这种结构更容易实现我们称之为函数堆栈框架的语义。函数可以非常有效地访问自己的堆栈帧,但不一定访问调用函数的堆栈帧,即整个堆栈


另一方面,如果以这种方式实现,堆将效率低下,因为人们期望堆能够在任何地方访问并可能删除项,而不仅仅是从它的顶部/底部

你有一个上面有n个元素的堆栈,最后一个是a,b在下面

pop操作返回弹出的值,因此,如果要访问顶部的第二个值b,可以执行以下操作:

var temp = stack.pop()
var b = stack.pop()
stack.push(temp)
然而,堆栈很少以这种方式使用。它是一个后进先出队列,在像后进先出队列一样被访问时效果最佳

似乎您更需要一个具有基于随机索引的访问的集合。
该集合可能存储在堆上。希望它能澄清一点堆栈弹出/推送。

让我们来看看您的案例场景

你有一个上面有n个元素的堆栈,最后一个是a,b在下面

pop操作返回弹出的值,因此,如果要访问顶部的第二个值b,可以执行以下操作:

var temp = stack.pop()
var b = stack.pop()
stack.push(temp)
然而,堆栈很少以这种方式使用。它是一个后进先出队列,在像后进先出队列一样被访问时效果最佳

似乎您更需要一个具有基于随机索引的访问的集合。
该集合可能存储在堆上。希望它能弹出/推一点。

好的,谢谢。但我仍然不明白弹出的变量放在哪里。@Iowa15我仍然不明白。。我脑子里有和你一样的问题。好的,谢谢。但我仍然不明白弹出的变量放在哪里。@Iowa15我仍然不明白。。我脑子里的问题和你一样。堆的结构不像堆栈,因为你不能像堆栈一样构造内存,并且仍然使用它来做堆的用途。堆的结构不像堆栈,因为你不能像堆栈一样构造内存,而且仍然用它来堆东西。那么你临时存放盘子的地方在哪里呢?再读一遍我在最后一段中写的内容,并思考一下。想象一下这些盘子,左手拿起上面的盘子作为一个临时存储位置,在编程中它是一个变量,抓住右边的下一个不同的变量,然后把你左手的那个放回那堆。那么你临时存放盘子的地方在哪里呢?再读一遍我在最后一段中写的内容,好好想想。想象一下这些盘子,左手拿起上面的盘子作为一个临时存储位置,在编程中它是一个变量,抓住右边的下一个不同的变量,然后把左手的那个放回堆上。