二者的差别类似于类型(作为模板)定义和数据对象(运 行的创建)的差别。 malloc在程序运行时创建新对象。 cal则是创建一个新的程序激活 事实上,激活也可视为一种数据对象,表示为存储块,含 有分量数据项。 °激活也有生命期。 °激活中独有的概念有:执行某激活,在执行中引用和修改 其他数据对象
•二者的差别类似于类型(作为模板)定义和数据对象(运 行的创建)的差别。 malloc在程序运行时创建新对象。 call则是创建一个新的程序激活。 •事实上,激活也可视为一种数据对象,表示为存储块,含 有分量数据项。 •激活也有生命期。 •激活中独有的概念有:执行某激活,在执行中引用和修改 其他数据对象
·子程序定义和激活的实现 考虑C中的子程序定义: float Fn(float X, int Y) { onst initval-2;常量定义 initval有左值和右值 # define finalval10宏定义: finalval无左值,只有右值。 Float M(10); int N N=initval If(n<finalval)...) Return(20*X+M(N);
•子程序定义和激活的实现 考虑C中的子程序定义: float FN (float X, int Y) {onst initval=2; 常量定义:initval有左值和右值。 #define finalval 10 宏定义:finalval无左值,只有右值。 Float M(10); int N; …… N=initval; If (N<finalval) {……} Return (20*X+M(N));}
这个定乂描述了子程序的运行时激活所需的部件 1、FN的基调行定义了参数和结果所需存储信息。 2、声明提供了局部变量的存储(M和N) 3、文字及被定义常量的存储 4、从子程序体中语句生成的可执行代码的存储 图5.1显示了子程序定义的运行时模板 °激活的模板分为两个部分: 静态部分:称为代码段,包含常量和可执行代码。它在 子程序执行中是不变的,可被所有激活共享。 动态部分:称为激活记录,包含参数、结果、局部数据 以及其它实现项(临时存储区、返回点、非局部变量引 用连接等),每个激活有相同结构,但数值不同 图52显示了子程序执行中的实际结构
这个定义描述了子程序的运行时激活所需的部件 1、FN的基调行定义了参数和结果所需存储信息。 2、声明提供了局部变量的存储(M和N)。 3、文字及被定义常量的存储。 4、从子程序体中语句生成的可执行代码的存储。 图5.1显示了子程序定义的运行时模板。 •激活的模板分为两个部分: 静态部分:称为代码段,包含常量和可执行代码。它在 子程序执行中是不变的,可被所有激活共享。 动态部分:称为激活记录,包含参数、结果、局部数据 以及其它实现项(临时存储区、返回点、非局部变量引 用连接等),每个激活有相同结构,但数值不同。 图5.2显示了子程序执行中的实际结构
子程序激活的结构(图5.1) Prologue to create Return point and activation record other system data FN result data Executable code X: parameter Y: parameter each M: local data object subprogram statement Epilogue to delete activation record 20 N: local data object 10 Code segment for Activation record for subprogram FN FN(Template)
子程序激活的结构(图5.1)
共享代码和分开的激活记录(图5.2) Static storage Dynamic storage Activation record for FN Successive invocations of Code segment Activation ′ subprogram FN for FN record for FN Activation record for FN
共享代码和分开的激活记录(图5.2)