【摘要】:例如,在Pascal和C的实现系统中,使用扩充的栈来管理过程的活动。当控制从调用返回时,将所占存储空间中的数据由栈顶弹出,同时,被中断的活动恢复执行。例如,Pascal和C语言都允许数据在程序运行时在堆中分配空间,以便建立动态数据结构。于是,运行时存储器的划分方案可如图7-9所示。图7-9运行时存储空间的划分
编译程序为了使编译后得到的目标代码能够运行,要从操作系统中获得—块存储空间,并对这块提供运行的空间进行划分,以便存放目标代码和数据。由于在编译时所有目标代码的地址都可以计算出来,所有过程的入口地址都是已知的,因此,目标代码在执行之前是固定的,编译程序可以把它放在—个静态确定的区域;但是,对数据的分配就不一样了,只有一小部分数据的大小在编译时能够确定,可以放在静态数据区,而大部分数据需要在执行时动态分配。
可以放在静态数据区的数据包括程序中的全局变量和静态变量,如Pascal中的全局变量、C语言中的全局和静态变量等。对于编译时不能确定存储空间的数据需要动态地分配存储空间,这些数据一般是局部于过程的。通常情况下,动态数据区包括栈(Stack)和堆(Heap)两个部分。栈用来分配后进先出LIFO(Last In,First Out)的数据。例如,在Pascal和C的实现系统中,使用扩充的栈来管理过程的活动。当发生过程调用时,中断当前活动的执行,激活新被调用过程的活动,并把包含在该活动生存期中的数据以及和该活动有关的其他信息存入栈中。当控制从调用返回时,将所占存储空间中的数据由栈顶弹出,同时,被中断的活动恢复执行。堆则用于非LIFO数据的动态分配。例如,Pascal和C语言都允许数据在程序运行时在堆中分配空间,以便建立动态数据结构。
一个栈或堆的大小是随着代码的运行而改变的,因此,可以使它们的增长方向相对。于是,运行时存储器的划分方案可如图7-9所示。(www.xing528.com)
图7-9 运行时存储空间的划分
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。