在C 中实现JAVA的存储管理机制

2013-12-27 19:20来源:www.lorgie.com 点击:

本文地址:http://www.lorgie.com/a/ligonglunwen/jisuanjixinxijishu/2013/1227/40953.html
文章摘要:在C 中实现JAVA的存储管理机制,鹤怨猿惊撞去自助,对对胡本源追根穷源。

冯辉宁

南京大学计算机系,210093

关键词:Java、C 、存储管理、对象、指针

众所周知,JAVA语言最明显的优势在于用它设计的程序可以广泛地运行于互联网上所有安装了VM解释器的计算机上。然而,如今JAVA之所以在市场上如此流行,还得益于它的另一卖点:它提供了安全可靠和使用方便的存储管理机制。这是部分编程人员将它与其前身C 语言对比后所得出的结论。本文将针对两种语言的内存(以对象为单位)使用机制,通过从灵活性、易用性和效率三个方面的比较,来证明这样一个事实:在C 中可以实现与JAVA一样的存储管理机制。

一、JAVA对象是C 对象和指针二者的继承

JAVA作为C 的后继,在内存分配和对象使用上与之有很大的相似之处。请看下面的比较:

1

操作

JAVA

C

指针使用

非指针使用

声明

ObjectClass Instance

ObjectClass* Instance

ObjectClass Instance

创建

Instance=new ObjectClass()

Instance=new ObjectClass()

声明时自动创建

数据访问

Instance.Data

Instance->Data

Instance.Data

方法调用

Instance.Method()

Instance->Method()

Instance.Method()

复制

指针复制

Instance1=Instance2

Instance1=Instance2

不提供

内容复制

由类自身定义

不提供

缺省,或由类自身定义

比较

指针比较

Instance1==Instance2

Instance1==Instance2

不提供

内容比较

由类自身定义

不提供

缺省,或由类自身定义

销毁

不再引用时由垃圾收集器自动销毁

delete Instance

超出作用域时自动销毁

注: ① C 的“指针使用”一列中并未列出形如*Instance的使用,因为这样做的实质不是指针使用;

②“指针复制”是指使得两个对象今后使用相同的一块内存区域,任何对此区域的修改同时会反映到这两个对象上;

③“内容复制”则指拷贝两个对象各自的存储区域,拷贝后内容相同,但各自保留自己的存储区,以后对任一者的修改不会影响另一者。

1

从上表可以看出,除了对象销毁机制以外,JAVA的对象其实是从C 中的对象和指针共同继承而来的。

但是,很多极力提倡JAVA语言的人似乎没有意识到这种关系。他们批评C 指针的概念太难被初学者接受。的确,对初学者来说,接受计算机存储器和指针的概念并不是轻而易举的事。事实上,很多程序员都经历过这样一个迷惘的阶段。但这并不意味着存在一种对存储器的解释可以完全避免“指针”这一概念——在JAVA语言中也是如此。现在有很多讲解JAVA语言的教材,但真正能够从头到尾不出现“指针”或者类似概念(不包括抨击C 语言时的使用)的,又有几本呢?

特别地,JAVA初学者由于理解的障碍,经常提出像这样的问题:“为什么像int、float这样的变量使用前不需要先用new命令来创建而对象却要呢?为什么两个对象互相复制以后,修改其中一个会影响另一个,而像int、float这样的基本数据类型却不会呢?两个值相等的对象,北京pk10模式新凤凰:用==比较的结果为什么是false,它们有什么是不等呢……”面对这样的问题,即使许多对JAVA比较熟悉的人有时也说不出个所以然来。究其原因,就是JAVA中的对象从来就没有离开C 指针的影子,特别是在创建、复制(事实上,JAVA默认时只提供指针复制)和比较等最常用的操作上。因而使用它们就必须遵循指针的规则,否则将无法为计算机或编程者所理解。在C 中,指针和对象其实是与int、float共通的数据类型,但又各有其特性;继承到JAVA中以后,二者的特性互相糅合而融为一体,因此对其含义的问题就产生模棱两可的解释:JAVA对象有时是对象,有时是指针,但大多数时候是指针。

对C 指针的另一种批评指出,C 允许指针指向任意内存区域,因此容易引起系统的干扰,即使很有经验的程序员在使用时也难免产生疏忽。这种批评不无道理,因为大部分C 程序出错的原因都与指针有关。但由此而批评指针存在的价值是不对的。没有C 程序员愿意从不使用指针。指针是程序设计的一样利器,凡涉及内存的操作,没有指针不能做到的,并且它的效率比其他任何替代方法都高。这就是众多C 程序员宁愿冒着高度的出错风险也坚持使用指针的最大原因,而并不是他们无法避免使用指针。如果真正要像JAVA语言那样刻意避免指针的话,笔者在后面可以证明,只要他们愿意,在C 程序员同样可以做到,而且性能比JAVA更好。他们可以设计一类彻头彻尾的C 对象,而他们的使用方法却与JAVA对象

编辑:admin 作者:
上一篇:利用C Builder自定义Windows窗体“系统菜单” 下一篇:谈网络中隐私权保护模式
------分隔线----------------------------
北京pk10计划在线计划 灵气北京pk10 pk10杀号方法 必发北京赛车pk10 北京赛车pk10必胜玩法
北京pk10官网精准群 北京赛车pk10历史直播 北京赛车pk10 北京赛车pk10玩法真正技巧 浩博北京赛车pk10是骗人的吗
北京pk10软件手机版免费下载 pk10开奖历史记录下载 北京pk10是什么彩票 北京pk10官网 北京pk10官方网站注册
北京pk10技巧万能5码 北京赛车pk10外围公式 北京pk10开奖直播网站 北京赛车pk10在线计划 北京赛车pk10开奖直播下载
云南十一选五走势 天津快乐十分前三组 德州口袋扑克 11选5开奖结果吉林 重庆时时彩计划群
快乐10分技巧 广东11选5基本走势 北京赛车注册 东京快乐8数据中心 天津快乐十分任二遗漏
山东体育彩票 北京pk10号码规律 新疆时时彩012走势图 幸运农场走势图直播 新疆时时彩专家
香港六合彩信息 福建31选7的走势 吉林11选5几号开 福利彩票双色球开奖结果走势图 七星彩综合走势图