通常,当您运行任何程序时,在执行期间可以使用哪些不同的存储空间以及它们用于什么? 我理解堆栈和堆。另外,我知道值类型在堆栈中,而ref类型在堆中。但是,我也遇到了程序计数器,指令指针等术语。
他们是什么意思?
BOUNTY: 下面有一些非常好的答案。我正在寻找更详细的东西。有些东西,不会强迫我阅读COA书中的几章。具体的博客/视频/解释是相关的。
答案 0 :(得分:3)
任何高级语言的主要内存类型都是您已经识别的两种:堆栈和堆。
你可以把它放在一个或另一个上是没有限制的;区别在于如何以及何时分配内存。调用函数时会分配堆栈空间,并且一次性完成,因此您无法从函数内部分配任何新的堆栈空间,并且一旦函数返回该内存被释放。另一方面,堆空间,您可以随时分配自己以及任何数量的分配。
内部使用的其他内存块肯定不会触及。例如,“程序计数器”和“指令指针”都是相同的:单个内存字,用于跟踪程序中哪个指令是下一个执行的指令。每次CPU执行指令时,程序计数器将继续执行下一个指令。
一旦你进行了函数调用,程序计数器就会与你自己的局部变量一起存储在堆栈中,这样当被调用的函数返回时,调用函数将知道它“停止”的位置。
答案 1 :(得分:3)
我认为你问的是两个不同但相关的问题。首先,我的计划的数据是如何组织的?不同的体系结构以不同的方式执行,但基本上,程序由3个(或4个,取决于您如何计算它们):data(堆和静态全局数据),stack(本地和函数)调用/返回数据)和text(代码)。
其次,计算机如何运行我的程序?这实际上是关于computer architecture和operating system语义的问题。 program counter或指令指针通常是CPU中用于运行程序的许多registers之一。它跟踪当前正在执行的指令的内存位置。其他包括stack (or frame) pointer(执行函数的堆栈帧的当前位置),程序状态字(有关当前指令结果的信息)和数据寄存器。
运行程序还有很多其他内容,我只是浏览了低级硬件位的表面,但是你提出的问题确实需要一本教科书才能完全理解。为了更彻底的治疗,我建议您在当地的书店或图书馆挑选Computer Organization and Architecture的副本。
答案 2 :(得分:2)
程序计数器和指令指针是一回事。基本上,指令指针跟踪CPU正在执行的指令。您的程序将位于内存的单独部分,有时也称为代码段。指令指针指向该段中的位置。
值得注意的是,程序计数器不保存在RAM中(这将太慢)。这是一个处理器寄存器。只有在对函数进行调用时,程序计数器才会存储在堆栈中。然后,当程序从函数调用返回时,返回值将从堆栈中弹出,程序计数器将被恢复。
See here有更详细的解释。
答案 3 :(得分:2)