续 定义/未定义/失去定义 只要分配存储对象必然有残值,无意义即未定义 赋值或初值变量得以定义 a,b:分配且有定义 34?? c,d:分配未定义或失去定义 e,f未分配或除配 声明和定义:定义必然声明;反之不然 声明的两个作用:给出对象,该对象的时间有效性 出了声明的作用域该对象失去定义。在声明的作用 域内显式删除也失去定义
续 3 4 ? ? a b c d e f 声明和定义:定义必然声明;反之不然 声明的两个作用 :给出对象, 该对象的时间有效性 出了声明的作用域该对象失去定义。在声明的作用 域内显式删除也失去定义 •定义/未定义/失去定义 只要分配存储对象必然有残值, 无意义即未定义 赋值或初值变量得以定义 a,b:分配且有定义 c,d:分配未定义或失去定义 e,f:未分配或除配
3.2.2存储模型 可存储值 Stora|e:指最小的可直接访问的可存储单元中的值 Pascal可存储值:集合不选择更新某一元素是可存储值, Pascal, C,Ada数组可选择更新,不是可存储值。 引用非可存储(C++可存储,过程和函数名也非可存储 ML几乎都是可存储值,也带来毛病:每次更新结构数据都要重 来。它们是: 基元类型值仅除数组 记录、构造、表不可更新其中一元素 函数抽象,ML重过程 变量引用 if exp then sin else cos )(x)asin(x)I cos(x) 可存储值
3.2.2 存储模型 • 基元类型值 仅除数组 • 记录、构造、表 不可更新其中一元素 • 函数抽象, ——ML重过程 • 变量引用 可存储值Storable:指最小的可直接访问的可存储单元中的值 Pascal可存储值:集合不选择更新某一元素是可存储值,Pascal, C ,Ada数组可选择更新, 不是可存储值。 引用非可存储(C++可存储), 过程和函数名也非可存储 ML几乎都是可存储值, 也带来毛病:每次更新结构数据都要重 来。它们是: ( if exp then sin else cos ) (x) 得sin(x)|cos(x) 可存储值
存储对象的生存期 每个存储对象都有创建(生),可用(活着),撤销(死)的 生命期。按生命期长短分: 全局变量和引用程序寿命一样长 局部变量和程序中的一个模块寿命一样长 持久变量比程序寿命长除非显式撤销文件变量 瞬间变量( transient持久变量的逆
存储对象的生存期 • 全局变量 和引用程序寿命一样长 • 局部变量 和程序中的一个模块寿命一样长 • 持久变量 比程序寿命长除非显式撤销 文件变量 • 瞬间变量(transient)持久变量的逆 每个存储对象都有创建(生), 可用(活着),撤销(死)的 生命期。按生命期长短分:
静态存储对象 编译时分配存储对象,近代语言类属对象直到装入后 确立( (elaboration)之时才定下存储对象叫静态分配 旦执行不再改动其存储,直至所在存储单元无效 叫静态( Static)存储对象 全局变量均为隐式的静态对象, COBOL,BASC全 静态, ALGOL,C是显示声明静态, Pascal除全局,Ada 不能。 C语言的静态变量是既私有又不随所在声明块中消逝 全局于所在文件。auto是静态分配动态装入不叫静态对象 Extern是静态对象。 extern static auto
静态存储对象 编译时分配存储对象, 近代语言类属对象直到装入后 确立(elaboration)之时才定下存储对象叫静态分配 一旦执行不再改动其存储,直至所在存储单元无效 叫静态(Static)存储对象 全局变量均为隐式的静态对象, COBOL,BASIC全 静态,ALGOL,C是显示声明静态,Pascal除全局,Ada 不能。 C语言的静态变量是既私有又不随所在声明块中消逝, 全局于所在文件。auto是静态分配动态装入不叫静态对象 。Extern是静态对象。 extern static auto
动态存储对象 把寿命特长的(如文件,全局量)排出来归到栈底的某一组,把寿命特 短的(如循环控制变量)另立嵌套组,这个问题也就解决。 块1「块2块3块45块6 寿命 5
动态存储对象 把寿命特长的(如文件,全局量)排出来归到栈底的某一组,把寿命特 短的(如循环控制变量)另立嵌套组,这个问题也就解决。 块1 块2 块3 块4 块5 块66 4 5 6 6 5 4 6 寿 命