72.1静态和动态内存分配 为目标程序分配运行时所需的存储空间,一种是在目标 程序运行前,由编译程序为数据分配存储空间,在程序的运 行期间不再分配和解除这种内存分配。另一种在程序运行期 间均可以对内存实现分配或解除分配,一旦存储分配解除该 存储空间内的数据便失去意义。前者称为静态存储分配,后 者称为动态存储分配。 定义7.3内存结合是指数据项的逻辑地址映射到内存物理地 址的联系 内存分配和内存结合是两个不同的概念,内存分配相当 于在上网时用户申请了用户名,此时网络营运商将某个用户 名“分配”给了该用户,但此时该用户不一定在上网。内存 结合相当于网络用户用了申请到的用户名上网。网络用户的 结合从用户的上网起至该用户下网止
7.2.1 静态和动态内存分配 为目标程序分配运行时所需的存储空间,一种是在目标 程序运行前,由编译程序为数据分配存储空间,在程序的运 行期间不再分配和解除这种内存分配。另一种在程序运行期 间均可以对内存实现分配或解除分配,一旦存储分配解除该 存储空间内的数据便失去意义。前者称为静态存储分配,后 者称为动态存储分配。 定义7.3 内存结合是指数据项的逻辑地址映射到内存物理地 址的联系 内存分配和内存结合是两个不同的概念,内存分配相当 于在上网时用户申请了用户名,此时网络营运商将某个用户 名“分配”给了该用户,但此时该用户不一定在上网。内存 结合相当于网络用户用了申请到的用户名上网。网络用户的 结合从用户的上网起至该用户下网止
内存分配是实现内存结合的过程和手段,内存结合在内 存解除分配时终止。源程序数据项的结合时刻决定编译程序 的处理方式。当编译程序可以产生内存分配的代码时,不要 在运行产生这种分配。这会影响到目标程序的效率。由于内 存分配的时机不同,引入静态存储分配和动态存储分配的两 种方式。 1.静态存储分配 在静态存储分配中,编译程序在运行前为数据分配内存 典型的静态存储分配是在编译时分配的。这要求编译程序在 编译时能确定目标程序运行中据需的全部数据空间的大小, 编译程序将数据和内存结合从而实现存储分配。编译程序 旦实现静态存储分配,在整个程序运行期间不再进行存储分 配或解除存储分配的工作直到整个程序运行结束。如C语言 中的全局变量和静态变量都是静态存储分配的
内存分配是实现内存结合的过程和手段,内存结合在内 存解除分配时终止。源程序数据项的结合时刻决定编译程序 的处理方式。当编译程序可以产生内存分配的代码时,不要 在运行产生这种分配。这会影响到目标程序的效率。由于内 存分配的时机不同,引入静态存储分配和动态存储分配的两 种方式。 1. 静态存储分配 在静态存储分配中,编译程序在运行前为数据分配内存。 典型的静态存储分配是在编译时分配的。这要求编译程序在 编译时能确定目标程序运行中据需的全部数据空间的大小, 编译程序将数据和内存结合从而实现存储分配。编译程序一 旦实现静态存储分配,在整个程序运行期间不再进行存储分 配或解除存储分配的工作直到整个程序运行结束。如C语言 中的全局变量和静态变量都是静态存储分配的
例:图说明了下列C语言程序段的静态数据存储分配 int a b c char d[100 int f maino int×=5,y=8; printf((“%d”,f(x):) printf(%d”gy):) int f(int n) Istatic int p=0; p+=n return(p)
例:图说明了下列C语言程序段的静态数据存储分配 int a,b,c; char d[100]; int f (); main() {int x=5,y=8; printf(“%d ”,f (x);) printf(“%d ”,g (y);) } int f(int n) {static int p=0; p+=n; return(p); }
int g(int m) [static float q=0; q+=m; return(g) 老变量q的存储交间 图中的阴影部分表示其它数据 的老变量的行4 的存储空间。 数d的存空问 静态存储分配的限制: 数据对象的长度和它在内 存中的位置在编译时都是已知 c的存储空 b的存惝空间 (2)不能建立如递归过程或递 a的存烤空间 函数中的一个名字对应多个 存储空间的结合 3个尼建立数据对象长度不图73c语言程序段的静态数据存储分配 定的存储空间
int g(int m) {static float q=0; q+=m; return(q); } 图中的阴影部分表示其它数据 的存储空间。 静态存储分配的限制: (1) 数据对象的长度和它在内 存中的位置在编译时都是已知 的 (2) 不能建立如递归过程或递 归函数中的一个名字对应多个 存储空间的结合 (3) 不能建立数据对象长度不 定的存储空间
2.动态存储分配 为了避免上述对静态存储分配的限制,引进了动态存储 分配。动态分配的数据区在运行不是一成不变的,它有时引 入,有时退出,是一个动态的变化过程。动态存储分配分为 大类,一类是随着程序单元的进入而分配,随着程序单元 的退出而撤销。另一类是由程序控制其分配和撤销。它们分 别用栈和堆来实现,被称为栈式动态存储分配和堆式动态存 储分配 a)栈式动态分配 当一个程序设计语言允许递归时,则每次进入该递归过 程或函数时,就应分配一块大小相同的内存。当该过程或函 数结束时相应的内存释放。由于递归过程或函数的进入和退 出符合栈的先讲后出的原则,故这一类存储分配可用栈实现 把每次进入过程或函数需分配的数据交称为活动记录
2. 动态存储分配 为了避免上述对静态存储分配的限制,引进了动态存储 分配。动态分配的数据区在运行不是一成不变的,它有时引 入,有时退出,是一个动态的变化过程。动态存储分配分为 二大类,一类是随着程序单元的进入而分配,随着程序单元 的退出而撤销。另一类是由程序控制其分配和撤销。它们分 别用栈和堆来实现,被称为栈式动态存储分配和堆式动态存 储分配。 a)栈式动态分配 当一个程序设计语言允许递归时,则每次进入该递归过 程或函数时,就应分配一块大小相同的内存。当该过程或函 数结束时相应的内存释放。由于递归过程或函数的进入和退 出符合栈的先进后出的原则,故这一类存储分配可用栈实现。 把每次进入过程或函数需分配的数据区称为活动记录