`
zhouyrt
  • 浏览: 1128302 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

存储绑定/生存期

阅读更多

上一篇提到了 绑定 中的 类型绑定

这篇说说存储绑定,程序设计语言的一种根本特征取决于这种语言的变量存储绑定的设计方式。

变量名 与 存储单元 之间的关联的这个过程称为 存储绑定 ,或称为 存储空间分配。

变量名与存储单元的解除绑定的这个过程称为 存储空间解除绑定

变量的 生存期 指该变量名被绑定于某一存储地址的时间。或者说一个变量名与某一存储地址从绑定到解除绑定的这段时间。

由此可见,变量的生存期与存储绑定紧密相连

一般为了分析变量的存储绑定,根据变量的生存期将其分为四种类型:

静态变量(静态分配)
栈动态变量(栈分配)
显示堆动态变量(堆分配)
隐式堆动态变量(堆分配)

有时也粗略的分为三种:静态变量,栈变量 和 堆变量。

一、静态变量

静态变量指在程序运行之前被绑定与某存储单元,一直保持不变直到程序运行结束的变量。

全局变量是静态分配的最典型的例子,数值和字符串也是静态分配的。

此外多数编译器还会生成各种表格,用于运行时的各种支撑例程如排错、动态类型检查、垃圾收集、异常处理等。
这些表格也是静态分配的。

静态分配的一半在一个受保护的只读存储区域,任何由于疏忽而去重写它们的企图都将导致处理器中断。

静态分配的优点:

1、全局变量常常用于程序执行的整个过程,因此将它们绑定与相同的存储空间。
2、让在子程序中声明的变量成为历史敏感的。
3、高效率,静态分配都可以直接寻址,其它类型的变量常常则是间接寻址。间接寻址速度较慢。另静态分配没有运行时分配与解除分配所需的开销

静态分配的缺点:

1、灵活性差,如仅有静态存储绑定的语言不支持子程序递归。
2、变量之间不能共享存储空间。

C/C++中允许在函数内的变量定义中使用static修饰符,使得所定义的变量为静态的。

但static修饰符作用于C++/Java/C#的类定义中的变量时却不是静态变量,这时是类变量。可见同一个保留字的多种用途可能产生混淆,尤其对于初学者。


二、栈动态变量

栈动态分配指当确定它们的声明语句时就产生了存储绑定,但它们的类型是静态绑定的(JS中例外,它的类型也是动态绑定的)。

这个绑定过程发生在程序执行到声明语句所依附的代码时,因此栈动态分配发生在运行时,其存储空间是运行时的栈。

C++/Java/C# 中方法内声明的变量都是栈动态的。而Ada中所有定义于子程序的非堆变量都是栈动态的。

栈动态分配的优点:

1,灵活性好,支持子程序递归
2,变量之间可共享存储空间

栈动态分配的缺点:

效率较低,间接寻址及需要在运行时分配及解除分配


三、显示堆动态变量

堆 是指一组使用了不规则,组织上高度松散的存储单元。

显示堆动态变量 是由程序人员指定特定的指令(如new,delete)来进行分配与解除分配的存储单元。
这些从堆上分配和解除分配的变量只能通过指针或引用变量来引用。

显示堆动态变量 有两个与其关联的变量

指针/引用:只有通过它们才能访问堆动态变量
堆动态变量自身:如N多基本类型变量组成的值自身

// java
Person p1 = new Person("name");

// js
var p1 = new Person('name');

 


使用new操作符进行存储分配,执行后返回指向该堆动态变量的引用,该引用可访问到堆动态变量自身。

int *inode;
inode = new int;
delete inode;

 
使用delete操作符进行解除存储分配,执行delete后解除了存储分配。

C++要求显示的解除分配,而Java/JavaScript则无需,它们采用垃圾回收机制。

C#中既有堆动态分配也有栈动态分配,这两者都是隐式的解除分配。

显示堆动态变量优点:
常用于动态结构,如链表,树等。这些结构需要在运行期间生长或收缩。通过指针或引用及使用显示堆动态变量能方便的构造出这种结构。

显示堆动态变量缺点:
1,难于正确使用指针变量或引用变量。
2,分配及解除分配所需的代价
3,存储管理上的复杂性


四、隐式堆动态变量

隐式堆动态变量 指当它们被赋值时才绑定到堆存储空间。实际上,当它们每次赋值的时候其都会被绑定一次。

如JavaScript中

ary = [33,55];

 
不管ary之前是否预先被定义使用过,现在它都是一个有两个值的数组。

隐式堆动态变量优点:

高度灵活性,允许编写极为通用的程序。

隐式堆动态变量缺点:

1,效率低,运行时维护所有动态属性的额外开销
2,编译器会遗漏某些错误检查
3,存储管理的复杂性

2
1
分享到:
评论

相关推荐

    3.ASP.NET 2.0 入门经典(第4版) [压缩包1/10]

    9.5 变量的作用域和生存期 316 9.6 泛型 317 9.7 本章小结 318 9.8 练习 319 第10章 组件化 321 10.1 代码与内容的分离 322 10.2 代码与设计的分离 323 10.3 后台代码 323 10.3.1 Page指令 324 10.3.2 不...

    程序设计教程 陈家骏等编著

    4.3.2 变量的存储分配(生存期) 90 4.3.3 *基于栈的函数调用的实现 93 4.3.4 C++程序的多模块结构 95 4.3.5 标识符的作用域 97 4.3.6 名空间(namespace) 103 4.4 递归函数 105 4.4.1 递归函数的定义 105 4.4.2 ...

    ASP3《高级编程》(第一部分)

    书名: ASP 3高级编程 ...15.1.3 组件/对象的生存期和状态 464 15.2 单元和线程模型 467 15.2.1 线程 467 15.2.2 单元 468 15.2.3 线程模型的属性 470 15.2.4 线程模型和范围 472 15.3 ...

    ASP3《高级编程》(第二部分)

    书名: ASP 3高级编程 ...15.1.3 组件/对象的生存期和状态 464 15.2 单元和线程模型 467 15.2.1 线程 467 15.2.2 单元 468 15.2.3 线程模型的属性 470 15.2.4 线程模型和范围 472 15.3 ...

    WellCMS-PHP

    WellCMS X是一款开源、倾向移动端的轻量级CMS,高负载CMS,亿万级CMS,是大数据量...增加自定义cookie生存期 增加https的安全传输方式,有效防止 XSS 增加api开关,默认关闭 增加前台所有页面赖加载 增加免登陆采集入库

    asp.net知识库

    利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的内容是否合法 asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到基本存储过程生成 使用SQLDMO控制 SQL Server 使用SQL...

    Android高级编程--源代码

     ◆存储和共享应用程序数据的技术  ◆如何创建基于地图的应用程序,如何使用gps和地理编码位置等基于位置的服务  ◆如何创建和使用后台服务及notification  ◆使用加速计、指南针和摄像头硬件  ◆与电话和网络...

    最新名企标准通用C++面试题,

    动态内存的生存期由我们决定,使用非常灵活,但问题也最多。 16.是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态? 答:virtual修饰符会被隐形继承的。private 也被集成,只事...

    Visual C++实践与提高-COM和COM+篇『PDF』

    3.1.3.1 生存期控制:AddRef和Release 3.1.3.2 接口查询:QueryInterface 3.1.4 全球唯一标识符GUID 3.1.5 COM接口定义 3.1.6 接口描述语言IDL 3.2 COM应用模型 3.2.1 客户/服务器模型 3.2.2 进程内组件 3.2.3 进程...

    ActionScript开发技术大全

    9.2文档类绑定和元件类绑定 194 9.2.1Flash文档类绑定 195 9.2.2元件类绑定 196 9.3小结 198 第10章对象交互与事件???199 10.1ActionScript3.0事件模型 199 10.1.1事件流 200 10.1.2事件侦听器 204 10.2事件对象 208...

Global site tag (gtag.js) - Google Analytics