第七章 运行存储分配
7.1 概述
编译器在工作过程中,必须为源程序中出现的一些数据对象分配**运行时的存储空间 **,
- 对于那些在编译时刻就可以确定大小的数据对象,可以在编译时刻就为它们分配存储空间,这样的分配策略称为静态存储分配
- 如果不能在编译时完全确定数据对象的大小,就要采用动态存储分配的策略。即在编译时仅产生各种必要的信息,而在运行时刻,再动态地分配数据对象的存储空间。
- 栈式存储分配
- 堆式存储分配
静态和动态分别对应 编译时刻和运行时刻
运行时内存的划分示意图为:
栈区存储活动记录等,活动执执行时进栈,结束后出栈
活动记录
活动记录是指使用过程(或函数、方法)作为用户自定义动作的单元的语言,其编译器通常以过程为单位分配存储空间,过程体的每次执行称为该过程的一个活动(activation) ,过程每执行一次,就为它分配一块连续存储区,用来管理过程一次执行所需的信息,这块连续存储区称为活动记录( activation record )
活动的一般形式包括:
7.2 静态存储分配
在静态存储分配中,编译器为每个过程确定其活动记录在目标程序中的位置 ,这样,过程中每个名字的存储位置就确定了 ,因此,这些名字的存储地址可以被编译到目标代码中 ,过程每次执行时,它的名字都绑定到同样的存储单元。
静态存储分配的限制条件
适合静态存储分配的语言必须满足以下条件 :
-
数组上下界必须是常数
-
不允许过程的递归调用
-
不允许动态建立数据实体
满足这些条件的语言有BASIC和FORTRAN等
常用的静态存储分配方法:
-
顺序分配法
-
层次分配法
7.2.1 顺序分配法
按照过程出现的先后顺序逐段分配存储