第9章运行时存储空间组织 n概述 n9.1运行时存储组织 u存储分配策略(重点) n9.2活动记录栈式存储分配的实现 F简单的栈式存储分配(C语言) F嵌套过程语言的栈式实现(略) n9.3过程调用:参数传递(略) n本章练习 2023/2/28 课程目录国☑1
2023/2/28 1 第9章 运行时存储空间组织 n 概述 n 9.1 运行时存储组织 u 存储分配策略(重点) n 9.2 活动记录 栈式存储分配的实现 F 简单的栈式存储分配(C语言) F 嵌套过程语言的栈式实现 (略) n 9.3 过程调用:参数传递(略) n 本章练习 课程目录
概述 p229 n任务 u对目标程序运行时的数据空间的组织和管理 n逻辑阶段 u在目标代码生成前,作准备 n实质:解决关联问题 绑定Binding) u源程序的文本—程序运行动作的实现 u源文件中的名字N一运行时的存储单元S 2023/2/28 区2
2023/2/28 2 概述 p229 n 任务 u 对目标程序运行时的数据空间的组织和管理 n 逻辑阶段 u 在目标代码生成前,作准备 n 实质:解决关联问题 绑定(Binding) u 源程序的文本——程序运行动作的实现 u 源文件中的名字N——运行时的存储单元S
运行时存储器的典型划分 p230 低目标代码区 存放程序的目标代码、 编译时确定 静态数据区 存放静态数据对象 J静态存储分配 栈区 管理过程调用 存放过程活动 运行时确定 所需的相关信息 动态存储分配 相向增长 栈式动态 空闲存储空间 可有效利用空间 堆式动态 实现动态数据分配 高堆区 调用mal1oc等函数 时申请的存储空间 2023/2/28 章节目绿国☑?
2023/2/28 3 运行时存储器的典型划分 p230 低目标代码区 静态数据区 栈 区 高 堆 区 存放程序的目标代码 存放静态数据对象 管理过程调用 存放过程活动 所需的相关信息 实现动态数据分配 调用malloc等函数 时申请的存储空间 空闲存储空间 相向增长 可有效利用空间 编译时确定 运行时确定 静态存储分配 动态存储分配 栈式动态 堆式动态 章节目录
9.1.3存储分配策略P231 n静态分配策略p231 u编译时对所有数据对象分配固定的存储单元 u且在运行时始终保持不变 n栈式存储分配p232 u运行时把存储器作为一个栈进行管理 u每当调用一个过程,它所需的存储空间就动 态地分配于栈顶 u一旦退出,它所占空间就予以释放 n堆式存储分配p233 u在运行时把存储器组织为堆 u允许用户动态申请和归还存储空间 u凡申请者从堆中分给一块,凡释放者退回给堆 2023/2/28 章节目绿心
2023/2/28 4 9.1.3 存储分配策略 P231 章节目录 n 静态分配策略 p231 n 栈式存储分配 p232 n 堆式存储分配 p233 u 编译时对所有数据对象分配固定的存储单元 u 且在运行时始终保持不变 u 运行时把存储器作为一个栈进行管理 u 每当调用一个过程,它所需的存储空间就动 态地分配于栈顶 u 一旦退出,它所占空间就予以释放 u 在运行时把存储器组织为堆 u 允许用户动态申请和归还存储空间 u 凡申请者从堆中分给一块,凡释放者退回给堆
9.2活动记录栈式存储分配的实现 p234 n过程的活动举例 float fac(int n) 为方便讨论,程序和函 {float f; 数也看作过程。有C程序: if(n=0)f=1; else f=n*fac (n-1); n执行时过程调用顺序: return f; fac(0) 返回值1 main() fac(1) {int i=2; ↓ 返回值1 printf(%f”,fac(i) fac(2) ↑N 返回值2 'n定义了两个过程 main 运行栈 main fac (n) 显示2 程序运行结束 2023/2/28 国应
2023/2/28 5 9.2 活动记录栈式存储分配的实现 p234 n 过程的活动举例 为方便讨论,程序和函 数也看作过程。有C程序: float fac(int n) {float f; if (n==0) f=1; else f=n*fac(n-1); return f; } main( ) {int i=2; printf(“%f”,fac(i) ); } n 定义了两个过程 main fac(n) main ↑ fac(2) ↑ fac(1) n 执行时过程调用顺序: ↑ fac(0) main的活动 fac的活动,n=2 fac的活动,n=1 fac的活动,n=0 运行栈 返回值1 返回值1 返回值2 显示 2 ↓ ↓ ↓ 程序运行结束