第七章 运行时的存储组织与分配 编泽程序必须为源程序中所出现的量(常量,变量及 数组等等)分配运行时的存储空间 分配方橐选择的是否得当将关系到资源的合理使用, 从而会影响到程序的运行效率, 存储分配的策略有静态分配与动态分配两类 静态分配适合于无动态申请内存,无可变体积数组, 无递归调用的程序.如FORTRAN,BASIC等 动态存储分配适用面广是目前最常用的分配方案 动亵分配又有钱式分配与维式分配两种
第七章 运行时的存储组织与分配 编译程序必须为源程序中所出现的量(常量,变量及 数组等等)分配运行时的存储空间. 分配方案选择的是否得当将关系到资源的合理使用, 从而会影响到程序的运行效率. 存储分配的策略有静态分配与动态分配两类. 静态分配适合于无动态申请内存,无可变体积数组, 无递归调用的程序.如FORTRAN,BASIC等. 动态存储分配适用面广是目前最常用的分配方案 动态分配又有栈式分配与堆式分配两种
7.1存储组织 7.1.1运行时内存的艾刘分 运行时,系统为目标程序分配的存储空 目标代码区 间按用途可划分为下面几个部分: 1.目标程序区存放目标程序; 静态数据区 2.静态数据区编译时可确定的占用存 储空间大小的数据: 运行栈区 3.运行栈区 运行时才能分配存储空 间的数据区: 4.堆区 用于用户动态申请存储 动态数据区 空间 堆区
7.1 存储组织 7.1.1 运行时内存的划分 运行时,系统为目标程序分配的存储空 间按用途可划分为下面几个部分: 1.目标程序区 存放目标程序; 2.静态数据区 编译时可确定的占用存 储空间大小的数据; 3.运行栈区 运行时才能分配存储空 间的数据区; 4.堆区 用于用户动态申请存储 空间 目标代码区 静态数据区 运行栈区 ↓ … ↑ 堆区 动 态 数 据 区
存储分配策略 ·因目标代码的长度在编译时就可确定,可放在静态区内; 对于在编译时已知大小的数据对象(如常量,全局变量,静 态变量等等),也可放在静态区内; 。 为提高运行效率,应尽可能多地分配静态数据空间. FORTRAN,BASIC的分配一般可全部放在静态区内. ·像PASCAL,C这类语言的实现,由于子程序允许递归地调 用,因此应用一数据栈来动态地管理内存分配, ·另外PASCAL和C还允许动态地中请的内存,这种数据的空 间可由堆式分配实现
存储分配策略 • 因目标代码的长度在编译时就可确定,可放在静态区内; • 对于在编译时已知大小的数据对象(如常量,全局变量,静 态变量等等), 也可放在静态区内; • 为提高运行效率,应尽可能多地分配静态数据空间. FORTRAN,BASIC的分配一般可全部放在静态区内. • 像PASCAL,C这类语言的实现,由于子程序允许递归地调 用,因此应用一数据栈来动态地管理内存分配. • 另外PASCAL和C还允许动态地申请的内存,这种数据的空 间可由堆式分配实现
7.1.2活动记录 ·一个过程的一次执行所需信 息的管理,是通过称为话动 返回的值 记录的连续存储块来实现的。 ·话动记录的内容见右图。 实参 。天 在PASCAL,C语言中,通常 任选的控制链 采用以过程为单位的动态存 储分配方案: 任选的存取链 当一过程被调用时,就把其话动 保存的机器状态 记录压入运行时存储栈顶,返 回时弹出之。 局部数据 临时变量
7.1.2 活动记录 • 一个过程的一次执行所需信 息的管理,是通过称为活动 记录的连续存储块来实现的。 • 活动记录的内容见右图。 • 在PASCAL,C语言中,通常 采用以过程为单位的动态存 储分配方案: 当一过程被调用时,就把其活动 记录压入运行时存储栈顶,返 回时弹出之。 返回的值 实参 任选的控制链 任选的存取链 保存的机器状态 局部数据 临时变量
活动记录的组成 1.临时意量域存放目标程序临时变量的值; 2. 局部款据域存放本次执行中的局部数据、简变、数组 内情向量等; 3. 机器状态域保存在调用该过程前有关机器状态的信息, 包括各种寄存器的当前值及返回地址等; 4. 径速的存取链为访问其它活动记录中所存放的非局部 数据提供链地址(PASCAL中用到); 5. 在進的控制链用于指向主调过程的活动记录; 6. 实在参数存放主调过程为被调过程提供的实参信息; 7. 返▣值域被调过程用来为主调过程存放返回值的域;
活动记录的组成 1. 临时变量域 存放目标程序临时变量的值; 2. 局部数据域 存放本次执行中的局部数据、简变、数组 内情向量等; 3. 机器状态域 保存在调用该过程前有关机器状态的信息, 包括各种寄存器的当前值及返回地址等; 4. 任选的存取链 为访问其它活动记录中所存放的非局部 数据提供链地址(PASCAL中用到); 5. 任选的控制链 用于指向主调过程的活动记录; 6. 实在参数 存放主调过程为被调过程提供的实参信息; 7. 返回值域 被调过程用来为主调过程存放返回值的域;