C语言(记录)——内存相关_2:内存的编址与管理
本文是基于嵌入式的C語言
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
內存編址方法
內存在邏輯上就是一個一個的格子,這些格子可以用來裝東西(里面裝的東西就是內存中存儲的數),每個格子有一個編號,這個編號就是內存地址,這個內存地址(一個數字)和這個格子的空間(實質是一個空間)是一一對應且永久綁定的。這就是內存的編址方法。
在程序運行時,計算機中CPU實際只認識內存地址,而不關心這個地址所代表的空間在哪里,怎么分布這些實體問題。因為硬件設計保證了按照這個地址就一定能找到這個格子,所以說內存單元的2個概念:地址和空間是內存單元的兩個方面。
內存和數據類型的關系
C語言中的基本數據類型有:char short int long float double
int 整形(整數類型,這個整就體現在它和CPU本身的數據位寬是一樣的)譬如32位的CPU,整形就是32位,int就是32位。
數據類型和內存的關系就在于:
數據類型是用來定義變量的,而這些變量需要存儲、運算在內存中。所以數據類型必須和內存相匹配才能獲得最好的性能,否則可能不工作或者效率低下。
比如:在32位系統中定義變量最好用int,因為這樣效率高。原因就在于32位的系統本身配合內存等也是32位,這樣的硬件配置天生適合定義32位的int類型變量,效率最高。也能定義8位的char類型變量或者16位的short類型變量,但是實際上訪問效率不高。
再如:在很多32位環境下,我們實際定義bool類型變量(實際只需要1個bit就夠了)都是用int來實現bool的。也就是說我們定義一個bool b1;時,編譯器實際幫我們分配了32位的內存來存儲這個bool變量b1。編譯器這么做實際上浪費了31位的內存,但是好處是效率高。
內存管理
說到內存管理就要說到數據結構和堆。
最簡單的數據結構——數組。當程序中有許多相同類型的數據需要同意管理時,單個的變量會顯得比較臃腫和雜亂,這時候就需要數組來有效管理數據,也就是對應于內存。但很明顯數組的優缺點從其使用特性中顯露無遺。?優勢:數組比較簡單,訪問用下標,可以隨機訪問。缺陷:1 數組中所有元素類型必須相同;2 數組大小必須定義時給出,而且一旦確定不能再改。針對數組的優缺點,結構體便隆重登場。
結構體。在管理一個或幾個事物的不同屬性,在數據上體現為不同的變量,這時,數組就會說“老子干不了”。結構體就是為了此種情況而生。比如,需要管理學生信息,就可以創建如下結構體,以便統一整齊管理。
struct student
{
unsigned int age;?????????
char name[20];
}
棧是一種數據結構,C語言中使用棧來保存局部變量。棧是被發明出來管理內存的。其管理內存的特點是小內存、自動化。
C語言中的局部變量是用棧來實現的。
我們在C中定義一個局部變量時(int num),編譯器會在棧中分配一段空間(4字節)給這個局部變量用(分配時棧頂指針會移動給出空間,給局部變量a用的意思就是,將這4字節的棧內存的內存地址和我們定義的局部變量名a給關聯起來),對應棧的操作是入棧。
注意:這里棧指針的移動和內存分配是自動的(棧自己完成,不用我們寫代碼去操作)。
然后等我們函數退出的時候,局部變量要滅亡。對應棧的操作是彈棧(出棧)。出棧時也是棧頂指針移動將棧空間中與a關聯的那4個字節空間釋放。這個動作也是自動的,也不用人寫代碼干預。棧的小內存特點可以說是其的缺點,所以所以我們在C語言中定義局部變量時不能定義太多或者太大(譬如不能定義局部變量時 int a[10000];)。
堆(heap)是一種內存管理方式。內存管理對操作系統來說是一件非常復雜的事情,因為首先內存容量很大,其次內存需求在時間和大小塊上沒有規律(操作系統上運行著的幾十、幾百、幾千個進程隨時都會申請或者釋放內存,申請或者釋放的內存塊大小隨意)。
堆這種內存管理方式特點就是自由(隨時申請、釋放;大小塊隨意)。堆內存是操作系統劃歸給堆管理器(操作系統中的一段代碼,屬于操作系統的內存管理單元)來管理的,然后向使用者(用戶進程)提供API(malloc和free)來使用堆內存。
我們什么時候使用堆內存?需要內存容量比較大時,需要反復使用及釋放時,很多數據結構(譬如鏈表)的實現都要使用堆內存。
堆管理內存的特點(大塊內存、手工分配&使用&釋放)
1:容量不限(常規使用的需求容量都能滿足)。
2:申請及釋放都需要手工進行,手工進行的含義就是需要程序員寫代碼明確進行申請malloc及釋放free。如果程序員申請內存并使用后未釋放,這段內存就丟失了(在堆管理器的記錄中,這段內存仍然屬于你這個進程,但是進程自己又以為這段內存已經不用了,再用的時候又會去申請新的內存塊,這就叫吃內存),稱為內存泄漏。
轉載于:https://www.cnblogs.com/printf631/p/7765878.html
總結
以上是生活随笔為你收集整理的C语言(记录)——内存相关_2:内存的编址与管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用SSIS Slow Changing
- 下一篇: 安装DRBD