对象:生存期 ■静态创建的对象在程序执行过程中始终存在,生存期是程 序整个执行过程 口例:C语言的全局变量 ■动态创建的对象具有较短的生存期 口例:C的局部自动变量,生存期是它所在的函数的执行期间 程序对象创建时可能需要执行一些动作,销毁时也可能需 要执行一些动作 口例:C标准函数 fopen创建一个FLE对象,建立文件链接(执行 些操作系统动作),分配数据缓冲区和附属结构。该对象生存 到相应的 fclose操作,销毁时需要清理缓冲区,释放相关存储, 释放文件链接 C+等语言允许程序员为对象的创建和销毁定义特定的动作 (构造函数和析构函数)
对象:生存期 ◼ 静态创建的对象在程序执行过程中始终存在,生存期是程 序整个执行过程 例:C语言的全局变量 ◼ 动态创建的对象具有较短的生存期 例:C的局部自动变量,生存期是它所在的函数的执行期间 ◼ 程序对象创建时可能需要执行一些动作,销毁时也可能需 要执行一些动作 例:C 标准函数fopen 创建一个FILE 对象,建立文件链接(执行 一些操作系统动作),分配数据缓冲区和附属结构。该对象生存 到相应的fclose 操作,销毁时需要清理缓冲区,释放相关存储, 释放文件链接 C++ 等语言允许程序员为对象的创建和销毁定义特定的动作 (构造函数和析构函数)
典型的存储分配方式 创建对象首先需要为其存储分配。典型的存储分配有三种情况: 口静态分配:给定一个绝对地址,执行中保持不变 口栈分配:如果对象具有后创建先销毁的性质,可采用栈分配,如过程的 调用和返回 口堆分配:不能采用上述方式分配的对象,只能在堆里分配 程序的存储区通常分为三部分:静态区,栈区(程序运行栈) 和堆区(动态管理区),分别对应上面的三种分配 静态区可能还分为只读区和读写区(依赖于操作系统支持): 口代码放在只读区,常量对象也可能放在只读区 口静态分配的变量放在静态区里的可读写区
典型的存储分配方式 ◼ 创建对象首先需要为其存储分配。典型的存储分配有三种情况: 静态分配:给定一个绝对地址,执行中保持不变 栈分配:如果对象具有后创建先销毁的性质,可采用栈分配,如过程的 调用和返回 堆分配:不能采用上述方式分配的对象,只能在堆里分配 ◼ 程序的存储区通常分为三部分:静态区,栈区(程序运行栈) 和堆区(动态管理区),分别对应上面的三种分配 ◼ 静态区可能还分为只读区和读写区(依赖于操作系统支持): 代码放在只读区,常量对象也可能放在只读区 静态分配的变量放在静态区里的可读写区
问题 例:试判断下面的c程序是否正确? char*p=a string", p=A 答:C语言不允许修改字符串常量,因此上面程序是错误的, 可能导致程序崩溃!!
问题 ◼ 例:试判断下面的c程序是否正确? ◼ char *p = "a string"; *p = 'A'; ◼ 答:C语言不允许修改字符串常量,因此上面程序是错误的, 可能导致程序崩溃!!
调用序列 运行时环境依靠调用序列来进行维护。 调用序列( calling sequence):当调用过程或函数时, 运行时环境必须发生的操作序列。 包括:过程活动记录的存储器分配、计算和保存参数, 必要的寄存器的保存和设置,放置可由调用程序访问 的返回值,以及活动记录存储器的释放 调用时执行的操作称为调用序列( call sequence)。返回 时执行的操作称为返回序列 return sequence)
调用序列 ◼ 运行时环境依靠调用序列来进行维护。 ◼ 调用序列(calling sequence):当调用过程或函数时, 运行时环境必须发生的操作序列。 •包括:过程活动记录的存储器分配、计算和保存参数, 必要的寄存器的保存和设置,放置可由调用程序访问 的返回值,以及活动记录存储器的释放。 •调用时执行的操作称为调用序列(call sequence)。返回 时执行的操作称为返回序列(return sequence)
哪些对象可以静态分配 能静态确定所有性质(包括大小)的对象才能静态分配。常见的有: 全局变量 口有些语言没有全局变量,如Java 子程序代码(翻译结果) 需要建立对象的常量,包括: 口一些全局的常量 口字符串和浮点数(可能还有一些整数) 局部静态变量。如c函数的 static变量,C+ +/Java类的 static数据 成员 编译系统可能在静态区建立一些支持程序运行所需的静态数据结构, 例如为支持动态检查和执行的表格(例如数组的维数和 界越界检 查,oo语言里类的虚表),支持存储管理和舁常处理的数据结构等 子程序代码、常量、字符串对象有可能分配在只读区域,修改它们将产 生动态运行错误(相关检査通常需要操作系统支持)
哪些对象可以静态分配 能静态确定所有性质(包括大小)的对象才能静态分配。常见的有: ◼ 全局变量 有些语言没有全局变量,如Java ◼ 子程序代码(翻译结果) ◼ 需要建立对象的常量,包括: 一些全局的常量 字符串和浮点数(可能还有一些整数) ◼ 局部静态变量。如C 函数的static 变量,C++/Java 类的static 数据 成员 ◼ 编译系统可能在静态区建立一些支持程序运行所需的静态数据结构, 例如为支持动态检查和执行的表格(例如数组的维数和上下界越界检 查,OO 语言里类的虚表),支持存储管理和异常处理的数据结构等 子程序代码、常量、字符串对象有可能分配在只读区域,修改它们将产 生动态运行错误(相关检查通常需要操作系统支持)