C\C++和Java 的區別(特別是在內存分配方面)

 前言:今天當被問到有關C與Java之間在內存管理方面的不同是什麼,瞬間 T_T__,所以特意集衆人之解,存入自己的學習筆記中,加以學習和鞏固。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Java和C都是指令式語言,

不同的是:

(1)Java有面向對象(OO,Object Oritended)成分在裏面,而C是完全面向過程的,C的高級版本C++、C#支持面向對象。

(2)Java中採用在某個類中定義一種公用靜態的變量來完成定義全局變量的功能;而不是在所有類之外定義全局變量。

(3)Java不支持頭文件;而C和C++語言中都是用頭文件來定義類的原型、全局變量、庫函數等。

(4)Java不支持宏定義,而是使用關鍵字final來定義變量;而C++在採用宏定義來實現常量定義。

(5)Java中不包含結構和聯合,所有內容都封裝在類裏面;而C和C++中結構和聯合的所有成員均爲公用,這就帶來了安全性問題。

(6)Java中不再使用指針,既省略了指針,每個指向對象的變量其實都是指針;而指針在C和C++中卻是最靈活、最易出錯的數據類型。

(7)Java跨平臺,既不同的操作系統都可以通過JVM(Java Virtual Machine(Java虛擬機))來解釋Java程序,而C、C++、C#則是與平臺(CPU+OS+Compiler)相關的,有些指令只在某些操作系統中才能執行。原因是:Java是解釋型語言,所有代碼都會翻譯成統一的、與系統無關的bytecode,然後放到JVM上運行,而C是編譯式語言,代碼要先通過編譯器轉換成與系統相關的中間代碼,然後才能運行。也可以理解爲Java中,int類型總是32位的,而在C和C++中,對於不同的平臺,同一個數據類型分配不同的字節數,同樣是int類型,在16位的操作系統(16位的寄存器,16位的編譯器)下,爲2個字節既16位;在32位的操作系統(32位的寄存器、32位的編譯器)下,爲4個字節既32位。這使得C語言造成不可移植性,而Java具有跨平臺性。

(8)Java不支持系統調用,既無法與操作系統進行交互,這是由它的跨平臺的特點決定的,而C則可以調用系統中的指令,如fork()。這也是爲何Java中只有線程(Thread)概念而沒有進程(Process)概念,而C兩者都有。

(9)在內存分配方面
       Java中對內存的分配是動態的,採用面向對象的機制,用運算符new爲每個對象分配內存空間。然而Java無法對內存進行控制,也可以說實際內存會隨着程序運行情況而改變。在程序運行中,每個Java系統自動對內存進行掃描,對長期不用的空間作爲“垃圾”進行收集(採用Gabbage Collection機制),使得系統資源得到更充分地利用。按照這種機制,程序員不必關注內存管理問題,使得Java程序得編寫變得簡單明瞭,並且避免了由於內存管理方面的差錯而導致系統出問題。而另外兩個都是通過指針對內存進行人爲分配的:C語言通過malloc()和free()這兩個庫函數來分別實現分配內在和釋放內存空間;C++語言則是通過運算符new()和delete()來分配和釋放內存。在C和C++的這種機制中,程序員必須非常仔細地處理內存的使用問題。一方面,如果對已釋放的內存或者是未曾分配的內存做釋放,都會造成死機;另一方面,若是對長期不用的或是不再使用的內存不釋放,則會浪費系統資源,甚至因此造成資源枯竭。


。。。。。。


非常感謝以下貢獻者:




同時也十分感謝以下擴展學習貢獻者:

“C與C++動態分配,釋放內存的區別”:http://wudikua123.iteye.com/blog/1517590
“32位和64位系統區別及int字節數 ” : http://blog.csdn.net/zhongzhiwei/article/details/8678885

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章