-
1 # 子子健康
-
2 # 日衝資訊 黃
這個問題涉及到記憶體分配的原理,有點晦澀難懂。客官請泡好茶聽我慢慢道來。
運算過程的概略跟執行程式有關的計算機部件主要是CPU,暫存器和記憶體。CPU是負責執行程式指令的核心部件,在內建時鐘的驅動下,它從暫存器中取得指令和資料運算後把結果寫回暫存器。這些指令是什麼樣子的呢?這些指令都是一些操作碼,有管邏輯運算的,有管輸入輸出的,特別是有管向記憶體的堆和棧裡讀寫資料的。之後會講到堆和棧和變數的關係,所以請記住這兩個字。記憶體中存放著程式指令和資料,這些東東透過暫存器傳輸給CPU同時把運算結果儲存下來。
記憶體結構概述我們所寫的c語言程式碼,經編譯連線之後被翻譯成了一連串的操作指令。在執行的時候,這些指令被讀入記憶體。程式在記憶體中是這樣存放的,程式碼段/資料區/堆/棧。其中,
資料區用來存放全域性變數堆是可動態申請的記憶體區域,順序上從前向後。需要注意的是這部分記憶體需要動態清理。棧用來儲存區域性變數,程式載入時已經分配(靜態分配)完畢,順序上是自後向前。變數型別和記憶體分配的關係終於說到正題了。變數型別既有邏輯上的意義,也有物理上的用途。在邏輯上,字元和數字是不同的概念,有必要做區分,在物理上,變數型別反映了所需記憶體區域的大小,系統可根據變數型別在資料區和堆疊區分配相應的記憶體。各種語言在處理記憶體分配上都是大同小異的。因為記憶體分配是由作業系統決定的。不過C語言中需要用顯式處理記憶體,比如,一個指標變數會被放在棧裡,而對它做初期化後,這個變數中就存放了一個堆裡的記憶體地址,如果不釋放指標,這段記憶體將一直被佔用。Java的記憶體結構也是類似的,它把類放在棧裡,由類申請堆裡的記憶體,但它使用了GC自動清理記憶體,隱藏或者叫封裝了記憶體申請和釋放的指令。一些指令碼語言也透過不同的方式把記憶體申請和釋放的過程加以封裝。使得變數型別單純地反映了其邏輯上的含義。
對程式設計有興趣的小夥伴可以提出問題,我有很多故事可以分享哦。
-
3 # 紅塵匆匆過客夢
很簡單,不僅是c還有其它編譯型語言都需要定義資料型別,因為編譯原理過程是先把源程式翻譯成目的碼,再連結成可執行程式碼,最後才能執行,如果資料變數單元沒有對應資料型別,那麼編譯器就無法正確處理,不能正確的給變數分配記憶體,不能正確的初始化變數資料。。所以編譯型語言是不同於解釋型語言的,是屬於靜態編譯資料型別的,而不是象解釋語言那樣邊翻譯邊執行,它是動態執行識別資料型別的
回覆列表
因為c語言是靜態語言,c之上的cpp,csharp,Java也是靜態語言,而javascript是動態語言,無需提前確定型別,因為編譯器需要知道你所宣告的型別,好開闢記憶體供你的資料使用,這樣可以減少執行時間消耗,大概就如此,具體的還是請大神來解答吧