- 相關(guān)推薦
在C++中實現(xiàn)JAVA的存儲管理機制
馮輝寧
南京大學計算機系,210093
關(guān)鍵詞:Java、C++、存儲管理、對象、指針
眾所周知,JAVA語言最明顯的優(yōu)勢在于用它設(shè)計的程序可以廣泛地運行于互聯(lián)網(wǎng)上所有安裝了VM解釋器的計算機上。然而,如今JAVA之所以在市場上如此流行,還得益于它的另一賣點:它提供了安全可靠和使用方便的存儲管理機制。這是部分編程人員將它與其前身C++語言對比后所得出的結(jié)論。本文將針對兩種語言的內(nèi)存(以對象為單位)使用機制,通過從靈活性、易用性和效率三個方面的比較,來證明這樣一個事實:在C++中可以實現(xiàn)與JAVA一樣的存儲管理機制。
一、JAVA對象是C++對象和指針二者的繼承
JAVA作為C++的后繼,在內(nèi)存分配和對象使用上與之有很大的相似之處。請看下面的比較:
表1
操作
JAVA
C++
指針使用
非指針使用
聲明
ObjectClass Instance
ObjectClass* Instance
ObjectClass Instance
創(chuàng)建
Instance=new ObjectClass()
Instance=new ObjectClass()
聲明時自動創(chuàng)建
數(shù)據(jù)訪問
Instance.Data
Instance->Data
Instance.Data
方法調(diào)用
Instance.Method()
Instance->Method()
Instance.Method()
復(fù)制
指針復(fù)制
Instance1=Instance2
Instance1=Instance2
不提供
內(nèi)容復(fù)制
由類自身定義
不提供
缺省,或由類自身定義
比較
指針比較
Instance1==Instance2
Instance1==Instance2
不提供
內(nèi)容比較
由類自身定義
不提供
缺省,或由類自身定義
銷毀
不再引用時由垃圾收集器自動銷毀
delete Instance
超出作用域時自動銷毀
注: ① C++的“指針使用”一列中并未列出形如*Instance的使用,因為這樣做的實質(zhì)不是指針使用;
②“指針復(fù)制”是指使得兩個對象今后使用相同的一塊內(nèi)存區(qū)域,任何對此區(qū)域的修改同時會反映到這兩個對象上;
③“內(nèi)容復(fù)制”則指拷貝兩個對象各自的存儲區(qū)域,拷貝后內(nèi)容相同,但各自保留自己的存儲區(qū),以后對任一者的修改不會影響另一者。
1
從上表可以看出,除了對象銷毀機制以外,JAVA的對象其實是從C++中的對象和指針共同繼承而來的。
但是,很多極力提倡JAVA語言的人似乎沒有意識到這種關(guān)系。他們批評C++指針的概念太難被初學者接受。的確,對初學者來說,接受計算機存儲器和指針的概念并不是輕而易舉的事。事實上,很多程序員都經(jīng)歷過這樣一個迷惘的階段。但這并不意味著存在一種對存儲器的解釋可以完全避免“指針”這一概念——在JAVA語言中也是如此,F(xiàn)在有很多講解JAVA語言的教材,但真正能夠從頭到尾不出現(xiàn)“指針”或者類似概念(不包括抨擊C++語言時的使用)的,又有幾本呢?
特別地,JAVA初學者由于理解的障礙,經(jīng)常提出像這樣的問題:“為什么像int、float這樣的變量使用前不需要先用new命令來創(chuàng)建而對象卻要呢?為什么兩個對象互相復(fù)制以后,修改其中一個會影響另一個,而像int、float這樣的基本數(shù)據(jù)類型卻不會呢?兩個值相等的對象,用==比較的結(jié)果為什么是false,它們有什么是不等呢……”面對這樣的問題,即使許多對JAVA比較熟悉的人有時也說不出個所以然來。究其原因,就是JAVA中的對象從來就沒有離開C++指針的影子,特別是在創(chuàng)建、復(fù)制(事實上,JAVA默認時只提供指針復(fù)制)和比較等最常用的操作上。因而使用它們就必須遵循指針的規(guī)則,否則將無法為計算機或編程者所理解。在C++中,指針和對象其實是與int、float共通的數(shù)據(jù)類型,但又各有其特性;繼承到JAVA中以后,二者的特性互相糅合而融為一體,因此對其含義的問題就產(chǎn)生模棱兩可的解釋:JAVA對象有時是對象,有時是指針,但大多數(shù)時候是指針。
對C++指針的另一種批評指出,C++允許指針指向任意內(nèi)存區(qū)域,因此容易引起系統(tǒng)的干擾,即使很有經(jīng)驗的程序員在使用時也難免產(chǎn)生疏忽。這種批評不無道理,因為大部分C++程序出錯的原因都與指針有關(guān)。但由此而批評指針存在的價值是不對的。沒有C++程序員愿意從不使用指針。指針是程序設(shè)計的一樣利器,凡涉及內(nèi)存的操作,沒有指針不能做到的,并且它的效率比其他任何替代方法都高。這就是眾多C++程序員寧愿冒著高度的出錯風險也堅持使用指針的最大原因,而并不是他們無法避免使用指針。如果真正要像JAVA語言那樣刻意避免指針的話,筆者在后面可以證明,只要他們愿意,在C++程序員同樣可以做到,而且性能比JAVA更好。他們可以設(shè)計一類徹頭徹尾的C++對象,而他們的使用方法卻與JAVA對象
【在C++中實現(xiàn)JAVA的存儲管理機制】相關(guān)文章:
ARM7系統(tǒng)中實現(xiàn)CF卡存儲的文件系統(tǒng)設(shè)計08-06
存儲器類型綜述及DDR接口設(shè)計的實現(xiàn)08-06
一種簡易數(shù)字波形存儲器的實現(xiàn)08-06
一種專用高速硬盤存儲設(shè)備的設(shè)計與實現(xiàn)08-06
基于WWW的協(xié)同式CAI軟件的Java實現(xiàn)08-06
基于WWW的協(xié)同式CAI軟件的Java實現(xiàn)08-06