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