C語言之內存

1、計算機程序=代碼+數據

馮諾依曼結構:數據和代碼放在一起(C語言中代碼其實就是函數,數據就是變量)。

哈佛結構:數據和代碼分開存在。

例:linux系統中,代碼和數據都在DRAM中,這就是馮諾依曼結構。

而單片機中,代碼在Flash中,數據在RAM中,這就是哈佛結構。

2、內存分動態內存(DRAM)和靜態內存(SRAM)

是用來存儲可變數據的,即變量。(也有例外:gcc中常量也存在內存,而大部分單片機中,常量都是存在Flash中)。

內存管理一般以頁面爲單位,一頁一般爲4kb,頁面內部以字節爲單位管理。

例:C語言通過API接口管理內存(如malloc/free)。

C++用new/delete。

JAVA通過虛擬機來操作內存。

3、32位系統,內存最多爲4G,即2的32次方。因爲32位系統的數據線與地址線均爲32條,而地址線的條數就決定了

內存地址的劃分數量。

4、內存位寬

內存本身的硬件實現有位寬限制,內存芯片之間可以進行串聯和並聯。從邏輯上講內存的位寬是任意的。

位 1bit ,字節 8bit ,半字 (一般爲16bit) ,字 (一般爲32bit) 。系統和平臺不一樣,字的大小也不一樣。

5、內存劃分

內存實際上劃分爲一個一個的小單元,每一個單元的編號就是內存地址,編程中指揮聯繫到內存地址,因爲內存

地址與內存單元是一一對應,相互綁定的。

內存編制是以字節爲單位的,即每個地址對應的空間大小爲8bit。

6、數據類型

int 整形(該類型與CPU本身的數據位寬是一樣的)

數據類型與內存相匹配,纔能有最好的性能,例如32位系統中編程就推薦使用int型變量,這樣訪問內存效率最高。

C語言中數據類型的本質含義:表示一個內存格子的長度和解析方法。函數名的實質就是這一段代碼的首地址。

指針變量和普通變量,例如 int a和int *p,a和p都代表一個內存地址。

7.數組

數組首元素a[0]的首地址就稱爲首元素首地址。

數據結構就是研究如何組織(在內存中排布)數據,如何加工數據。

最簡單的數據結構,數組(可以管理多個類型相同,意義相關的變量)

數組的優點:可隨機訪問。

數組的缺點:元素類型必須相同,數組大小必須定義時給出。

C語言結構體內嵌指針可以實現面向對象。(linux就是利用C語言寫的,具有面向對象功能的系統)

在JAVA等高級語言中,有一些語法技巧可以更改數組的大小,但其實這只是一種障眼法。它的工作

原理是:先重新創建一個新的數組大小爲要更改後的數組,然後將原數組的所有元素複製進新的數組,

然後釋放掉原數組,最後返回新的數組給用戶。

8.內存管理

棧(stack)C語言中用來保存局部變量,棧管理內存,分配和回收都是C語言自動完成。

因爲棧中的內存是反覆使用的,所以定義局部變量時,如果沒有初始化該變量,則該變量的值是隨機的。

約束:棧的大小是固定的,太小容易溢出,太大浪費內存。爲避免棧溢出,C語言中定義局部變量時不能

定義太多或太大,使用遞歸來解決問題時一定要注意遞歸收斂。

堆(heap)

隨時申請、釋放,大小塊隨意。堆內存由操作系統劃歸給堆管理器來管理,向使用者(用戶進程)提供

API(malloc/free)來使用堆內存。

堆管理內存,需要手動申請和釋放,如果申請了之後忘記了釋放,會容易造成內存泄漏。

void *malloc (size_t size);

void *calloc (size_t nmemb,size_t size);//nmemb個單元,每個單元size字節

void *realloc (void *ptr,size_t size);//改變原來申請的空間的大小

堆內存申請是必須給定大小,然後一旦申請完成大小不變,如果要更改,只能通過

realloc接口。realloc的實現原理類似於上面說的JAVA中的可變大小的數組的方式。

 

 

 

 

 

 

 

 

 

 

 

 

 

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