编译器设计中存储分配的技术是什么?
存储分配技术有多种,如下所示:
静态分配
这是最简单的分配方案,其中数据对象的分配在编译时完成,因为每个数据项的大小都可以由编译器确定。
递归子程序和可调长度数组在语言中是不允许的。在静态分配中,编译器可以决定每个数据对象所需的存储量。因此,编译器很容易识别激活记录中这些数据的地址。
FORTRAN 使用这种存储分配策略。
优点
- 易于实现。
- 允许在编译期间进行类型检查。
- 消除了内存不足的可能性。
缺点
- 与递归子程序不兼容。
- 无法使用大小必须在运行时确定的变量。
- 如果数据对象的大小在编译时已知,则可以完成静态分配。
动态分配(栈分配)
栈分配是一种运行时存储管理技术。激活记录分别在激活开始和结束时被压入和弹出。
每个过程调用中的局部变量的存储都包含在该调用的激活记录中。因此,局部变量在每次激活中都绑定到新的存储,因为在进行调用时,一个新的激活记录会被压入栈中。
它可以在运行时确定变量的大小,因此局部变量可以在不同的激活期间具有不同的存储位置和不同的值。
它允许递归子程序。
ALGOL 语言使用此策略。
在每次执行过程中,都会生成一个激活记录,其中包含诸如局部数据、实际参数、返回值、过程的返回地址等信息。该过程的激活记录被保存到栈中。
如果过程 A 调用 B,然后 B 调用 C,则栈分配将是
优点
- 它支持递归。
- 它为数据项动态创建数据结构。
优点
- 可以使用指针和索引寄存器进行内存寻址。
堆存储分配
它能够在非嵌套设计中分配内存。存储可以从称为堆的区域中任意分配和释放。
堆分配 有助于执行大小在程序运行时变化的数据。
堆维护为一个称为空闲空间列表的空闲空间列表。
优点
一个大的存储块可以在运行时被划分为较小的块。
缺点
它会产生碎片问题。
广告