1. 程式人生 > >C\C++和Java 的區別(特別是在記憶體分配方面)

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++的這種機制中,程式設計師必須非常仔細地處理記憶體的使用問題。一方面,如果對已釋放的記憶體或者是未曾分配的記憶體做釋放,都會造成宕機;另一方面,若是對長期不用的或是不再使用的記憶體不釋放,則會浪費系統資源,甚至因此造成資源枯竭。 。。。。。。 非常感謝以下貢獻者:
同時也十分感謝以下擴充套件學習貢獻者: