有人可以建议我使用任何练习或代码来帮助我更好地理解堆和堆栈内存吗?我已经在教科书中读到了很多,只是想看一些代码来更好地理解。也许有些堆栈溢出的例子或类似的东西。我认为C / C ++将是一个理想的候选人。
答案 0 :(得分:0)
堆栈和堆都驻留在内存中。哪些确切不一定重要,但您应该设法了解他们的数据结构。
<强>堆强>
对于堆,你应该阅读malloc
的{{3}},它应该让你知道它是如何工作的(包括代码)。
筹码(理论):
堆栈(基本数据结构)是一个相当简单的概念,可以理解并解释得很好this example implementation。该链接还简要介绍了如何在您的计划中使用它。我没有找到一些我认为以一种很好的方式描述它的东西,所以我将包括以下内容作为后续的参考:
如果这些解释不正确,您应该尝试以您将理解的方式找到解释调用堆栈和堆栈框架的内容。< / p>
堆叠(代码):
我指出的所有链接都解释了理论,并没有给你代码。在了解了计算机体系结构和汇编语言后,我对堆栈的理解得到了显着改善。
因此,如果您需要代码示例,您应该尝试实现一个简单的汇编函数并将其链接到C程序。 here
Java和C ++:
Java和C ++隐藏了这些东西,所以如果这是一个学习练习,我推荐C和汇编。我不确定是否有可能在Java中完成它。你可以在C ++中但它变得复杂......
我对调用堆栈的解释:
我将尝试简要说明与C编程语言和汇编相关的调用堆栈和堆栈帧。
为此,我们可以定义一台简单的机器,以便我们可以在同一页面上开始。
我们的处理器具有有限数量的寄存器,比如说8.加法,减法,比较等操作只能在寄存器上完成。您只能在内存上执行两条指令,它们是加载和存储。这些指令分别从存储器复制到寄存器,或从寄存器复制到存储器。
现在,如果我们想要添加2个数字,我们有很多变量。我们将一个数字加载到寄存器1中,另一个加载到寄存器2中,添加它们并将结果放入寄存器3.现在,如果我们对寄存器4和5进行另一个操作,将结果存储在寄存器6中然后想要添加寄存器7和8我们在哪里放置结果?我们已经用完了变量......
显然,当我们不处理时,我们需要使用内存并保存信息。要做到这一点,我们需要知道每个变量在内存中的 where 。
您可以记住每个变量的地址,并在每次手动输入它们,可能会将它写在桌面上一张纸上合理的名称旁边。但这将是乏味的,并会对功能造成严重限制。
函数具有本地变量。如果这些变量的地址是硬连线的,那么它们将始终分配到函数中,并且会给递归带来很大的问题。如果函数调用自身,它将覆盖调用者(本身)正在使用的值。
要解决这个问题,最简单的方法是使用堆栈。但是,要这样做,我们需要在某处保留堆栈指针地址。所以我们只是同意从现在起我们将使用寄存器8作为堆栈指针。
还可以说,当你把东西推到堆栈上时,我们将从堆栈指针中减去我们想要的字节数,当我们想要弹出时,我们将把字节数添加到< em>堆栈指针。
每次调用函数时,我们都会将局部变量放在堆栈上。由于我们知道我们想要什么变量,因此我们知道需要多少内存。
但要访问每个本地变量,我们需要知道它的地址......让我们设置一个例子。
假设我们有2个变量,它们在我们的函数中都有2个字节,堆栈指针是18个。
根据我们的协议,我们从堆栈指针中减去4个字节,使堆栈指针等于14。
现在要访问第一个变量,我们将简单地使用堆栈指针。要访问第二个,我们将从堆栈指针中减去2。
只要我们的函数正在运行,这将是真的,但在我们的函数退出之前,我们将释放我们的局部变量从堆栈再次添加4,使堆栈指针18(如这是在我们开始之前)。