第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 国D2
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 ↓ ↓ ↓ 程序运行结束