一个对象拥有其语义价值的区域<其作用域

当一个变量将不再被使用,那它应该被理想的回收机制回收。但现实是我们仅当一个变量离开了其作用域,或变成不可访问,才考虑回收。

然而,作用域规则有其优点:1.可以一次性考虑一组语义上存在关系的变量,并能对其进行成批回收。

相对于显式的作用于规则,隐式的自动垃圾回收将尝试提前回收作用域周期较长的变量。

但另一方面,我们需要更灵活的引用环境规则,来获得更丰富的语义表述。

语言设计的目标:高级特征——高抽象级别

机器无关性:不依赖于特定指令集

名字:有效标识符(词法分析,扫描器),用来表示变量 ,常量,操作,类型等。完成了一次抽象。

低级  高级

地址  标识符

抽象是一个过程,,将一个名字与一个程序片段相关联,封装成一个接口。

子程序:控制抽象。类:数据抽象。

抽象隐藏了细节,减少了概念的复杂性。我们将要看到的,是复杂的实现细节,以及判断在抽象中暴露哪些细节,隐藏哪些

在3-8章中用对象表示可以有名字的东西

3.1约束时间:名字与事物的约束

约束时间:实现决策的期间。在各个阶段确定一部分语义,消除不确定性

语言设计时:控制流程,内部数据结构,类型构造器等语言语义

语言实现时:类型精度,IO连接到操作系统,栈堆组织方式,异常处理

编写语言时:算法,数据结构,名字

编译时:高级结构映射到机器代码,静态定义数据在内存中布局

连接时:标准子程序库或其他模块连接

装入时:为对象选择机器地址,虚拟地址翻译到物理地址计算映射

运行时:值与变量的约束。程序启动时,模块入口时,加工时(首次声明),子程序调用时,分程序进入时,语句执行

术语:静态,动态

编译器确定全局变量在内存中的分布,确定局部变量的地址偏移(帧指针)。布局&高效访问

3.2为对象分配与释放存储空间的机制,对象与名字的生存期

命名&约束

名字引用对象

关键事件:对象,名字  创建,引用,失活激活,撤销

生存期:创建——撤销(

对象的名字的不重合:悬空引用,内存泄漏

作用域:进入,退出(空洞),失活激活,结束

生存期对应于三种主要的存储分配机制,用于管理!对象!空间

静态对象:绝对地址,全局

栈对象:先进先出分配释放,对应于子程序调用与退出

堆对象:任意时间,要求更通用的存储管理算法

1.静态分配:全局变量,语句翻译成的指令,子程序在调用间保持值的局部变量,常量字面量(小的保存在指令中,大的保存在存储区),

编译器生成的:表格,支持运行时的例程:调试,动态类型检查,废料收集,异常处理

其中执行时不该改变的:指令,常量,运行时表格,分配受保护的只读区,写操作导致处理器中断

编译时常量:常量,常量调用内部函数&算术运算符,

加工时常量:依赖于程序具体运行,加工后不变

???不会同时出现对同一子程序的多个活动状态的调用——静态分配局部变量

编译器负责保存:加工时常量,局部变量?子程序相关信息:参数值&返回值寄存器或内存,临时量:寄存器,簿记信息:返回地址,动态链,寄存器内容,错误信息

2.栈

递归结构:局部变量不能静态分布——一个变量可以同时拥有多个实例个数

嵌套结构:容易分配栈空间

子程序实例:在栈上的帧中,包含:参数,返回值,局部变量,临时值,簿记信息

栈维护子程序的调用序列:调用者,前序,后序代码组合

编译器不能确定帧栈地址,(静态)确定对象在帧内的偏移(寄存器,帧指针)

局部变量,临时值,簿记信息:帧负偏移

参数,返回值:帧正偏移(调用方帧内)

当前活动子程序数目<<all子程序数目,栈中分配好于静态

栈指针:第一个未用位置

帧指针:帧中已知未知

3.堆

大小可变的对象:赋值与更新操作

堆空间管理:速度与空间的权衡

内部碎片:供>求

外部碎片:max供<求<all供

自由表:未使用空间的链接表

最先适配:

最佳适配:搜索开销 ,较少的外部碎片

供>>求时,两种算法都切块

合并相邻未分配块

维护单一自由表:分配的代价与自由块数目,线性相关

为不同大小的块维护不同的自由表,将堆划分成存储池

划分:静态,动态:伙伴系统2的乘幂,斐波那契堆,及时合并

外部碎片问题:碎片数量随时间递增,max块递减

移动已分配块,堆的紧缩

废料收集

手动:识别对象的生存周期的结束。悬空引用,流失存储

自动:边际复杂性降低

3.3作用域规则

约束的作用域:约束起作用的正文区域,大多为静态确定

3.5别名,重载,多态

3.6宏扩

Charpter3 名字 作用域 约束的更多相关文章

  1. 代码之髓读后感——名字&作用域&类型

    名字和作用域 为什么要取名 看着代码中遍地都是的变量,函数,或多或少的我们都应该想过,为什么会有这些名字呢? 我们知道,计算机将数据存储到对应的物理内存中去.我们的操作就是基于数据的.我们需要使用这些 ...

  2. [程序设计语言]-[核心概念]-02:名字、作用域和约束(Bindings)

    本系列导航 本系列其他文章目录请戳这里. 1.名字.约束时间(Binding Time) 在本篇博文开始前先介绍两个约定:第一个是“对象”,除非在介绍面向对象语言时,本系列中出现的对象均是指任何可以有 ...

  3. C++名字空间/C++命名空间

    0.序言 名字空间是C++提供的一种解决符号名字冲突的方法. 一个命令空间是一个作用域,在不同名字空间中命名相同的符号代表不同的实体. 通常,利用定义名字空间的办法,可以使模块划分更加方便,减少模块间 ...

  4. Python进阶 - 命名空间与作用域

    Python进阶 - 命名空间与作用域 写在前面 如非特别说明,下文均基于Python3 命名空间与作用于跟名字的绑定相关性很大,可以结合另一篇介绍Python名字.对象及其绑定的文章. 1. 命名空 ...

  5. SQL Server中有关约束(constraint)的一些细节

    本文出处:http://www.cnblogs.com/wy123/p/7350265.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...

  6. python命名空间、作用域、闭包与传值传引用

    (以下内容,均基于python3) 最近在看python函数部分,讲到了python的作用域问题,然后又讲了Python的闭包问题. 在做作业的时候,我遇到了几个问题,下面先来看作业. 一. 作业1: ...

  7. sql 约束汇总

    主要就是增加数据约束的.   Oracle中的约束简单介绍 约束   Including Constraints     在数据库中使用约束(constraints)是为了在该数据库中实施所谓的&qu ...

  8. MySql -- unique唯一约束

    3.UNIQUE 约束 约束唯一标识数据库表中的每条记录. 创建一张测试表 CREATE TABLE `test`.`info`( `id` ) UNSIGNED NOT NULL AUTO_INCR ...

  9. 当OOP语言RAII特性发展到functional形式的极致

    本文主要站在C++程序员的思维角度思量. functional之路 lambda表达式 lambda表达式,是一段代码片段.函数实现体中出现的可重用的代码块. 在C++之前,C语言最小可复用流程模块, ...

随机推荐

  1. 一款C++写的tcp性能测试(压力测试)工具

    基线终于开发完了,自己写的服务器性能和压力承受能力到底怎么样,在网上没有找到合适的测试工具可以用.于是自己基于MFC写了一款测试工具. 启动界面如下: 设置参数后,运行如下: 运行完界面如下: 源码路 ...

  2. UITableViewCell嵌套UITableView的正确姿势

    内嵌UiTableView的高度计算起来太麻烦了,如何解决,就是把二级TableVIew里面的model item做到一级,然后对不同的item类型做不同的Cell,这样就Ok了.给一个得到Cell的 ...

  3. MongoDB与CouchDB 全方位对比

    http://blog.nosqlfan.com/html/1519.html 本文见于MongoDB官方网站,MongoDB与CouchDB 很相似,他们都是文档型存储,数据存储格式都是JSON型的 ...

  4. LR性能测试结果样例分析

    http://www.cnblogs.com/hyzhou/archive/2011/11/16/2251316.html   测试结果分析 LoadRunner性能测试结果分析是个复杂的过程,通常可 ...

  5. Ocelot中文文档-中间件注入和重写

    警告!请谨慎使用. 如果您在中间件管道中看到任何异常或奇怪的行为,并且正在使用以下任何一种行为.删除它们,然后重试! 当在Startup.cs中配置Ocelot的时候,可以添加或覆盖中间件.如下所示: ...

  6. DDGScreenShot—图片擦除功能

    写在前面 图片擦除功能,也是运用图片的绘制功能, 将图片绘制后,拿到相应的图片.当然,有一涨底图更明显 实现代码如下 /** ** 用手势擦除图片 - imageView --传图片 - bgView ...

  7. SOFA 源码分析 —— 服务发布过程

    前言 SOFA 包含了 RPC 框架,底层通信框架是 bolt ,基于 Netty 4,今天将通过 SOFA-RPC 源码中的例子,看看他是如何发布一个服务的. 示例代码 下面的代码在 com.ali ...

  8. Oracle知识梳理(三)操作篇:SQL基础操作汇总

    Oracle知识梳理(三)操作篇:SQL基础操作汇总 一.表操作 1.表的创建(CREATE TABLE): 基本语句格式:       CREATE TABLE  table_name ( col_ ...

  9. The Beam Model:Stream &amp; Tables翻译(上)

    本文由  网易云发布. 作者:周思华 本篇文章仅限内部分享,如需转载,请联系网易获取授权. 本文尝试描述Beam模型和Stream & Table理论间的关系(前者描述于数据流模型论文.the ...

  10. leetCode刷题(使用链表做加法)

    Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 Explanation: 342 + 465 = ...