2013-07-25 134 views
-1

有人可以建议我使用任何练习或代码来帮助我更好地理解堆栈和堆栈内存吗?我已经在教科书中阅读了很多,只是想看到一些代码更好地理解。也许一些堆栈溢出的例子或类似的东西。我认为C/C++将是一个理想的候选人。使用C/C++/Java程序理解堆栈和堆栈

回答

0

堆栈和堆都驻留在内存中。在哪里并不一定重要,但你应该设法了解他们的数据结构。

堆:

对于你应该阅读的mallocthis example implementation,它应该给你它是如何工作的想法堆(包括代码)。

栈(理论):

堆栈(基本的数据结构)是一种相当简单的概念来理解和解释不够好here。该链接还简要介绍了它在程序中的使用方式。我还没有发现的东西,我想说明它在一个不错的方式,所以我会包括以下内容作为附加参考跟进:

  1. 有一个关于它可用here
  2. 一个简单的电源点有趣(而且相当参与)视频here
  3. 和简化解释here

如果这些不太解释是正确的,你应该尝试找到一些解释调用堆栈并在某种程度上你就会明白堆栈帧

栈(代码):

我所指出的链接解释的理论,不给你的代码。在了解计算机体系结构和汇编语言后,我对堆栈的理解得到了显着改善。

所以,如果你想要一个代码示例你应该尝试和实现一个简单的汇编函数并将其链接到一个C程序。 Here is an example (with a brief intro into assembly)

Java和C++:

Java和C++隐藏你这个东西,所以如果这是一个学习的过程,我建议C和汇编。我不确定是否可以用Java来做到这一点。你可以在C++,但它变得复杂了......

我的调用堆栈的解释:

我会尝试给调用堆栈的一个简短的说明和堆栈帧相对于C编程语言和大会。

要做到这一点,可以定义一个简单的机器,以便我们可以在同一页面上开始。

我们的处理器具有有限数量的寄存器,可以说8个。像加法,减法,比较等操作只能在寄存器上完成。只有两条指令可以在内存上执行,它们是加载商店。这些指令分别从存储器复制到寄存器或从寄存器复制到存储器。

现在,如果我们想要添加2个数字,我们有很多变量。我们将一个数字加载到寄存器1中,另一个数字加载到寄存器2中,并将它们相加并将结果存入寄存器3.现在,如果我们对寄存器4和5执行另一个操作,则将结果存储在寄存器6中,然后想要添加寄存器7和8我们在哪里放置结果?我们已经用完了变量...

很明显我们需要使用内存和保存信息,当我们不是处理它。要做到这一点,我们需要知道其中在每个变量的内存中。

您可以记住每个变量的地址,并且每次都手动输入它们,可能会将其写在桌子上一张纸上明智的名称旁边。但那将是乏味的,并且会对功能造成严重的限制。

函数有本地变量。如果这些变量的地址是硬连线的,那么它们总是会被分配给,并且会对递归造成很大的问题。如果一个函数自己调用,它会覆盖它调用者(本身)正在使用的值。

要解决这个问题,最简单的方法是使用堆栈。但是,为此,我们需要保持堆栈指针地址。所以让我们同意,从现在起我们将使用寄存器8作为我们的堆栈指针

也可以说,当你把东西到堆栈中,我们将减去我们从堆栈指针想要的字节数,当我们要弹出我们的字节数添加到堆栈指针

每次我们调用函数时,我们都会将其局部变量放在堆栈上。既然我们知道我们想要什么变量,我们知道需要多少内存。

但要访问每个本地变量我们需要知道它的地址...让我们设置一个示例。

比方说,我们有2个变量,这两者在我们的功能2个字节,堆栈指针为18

根据我们的协议,允许用户从堆栈指针减去4个字节,使得堆栈指针等于14.

现在要访问第一个变量,我们将简单地使用堆栈指针。要访问第二个,我们将从堆栈指针中减去2。

只要我们的功能正在运行,这将是真实的,但在此之前我们的函数退出,我们将免费我们从堆栈中的局部变量再次将4它,使堆栈指针18(就像是我们前启动)。