資料在記憶體中的存放

2022-07-27 12:09:16 字數 1185 閱讀 5471

在計算機系統中,執行的應用程式的資料都是儲存在記憶體之中

不同型別的資料,儲存的記憶體區域不同,其中包括:

1->棧區(stack) 由編譯器自動分配並釋放,一般存放函式的引數值,區域性變數等

2->堆區(heap) 由程式設計師分配和釋放,如果程式設計師不釋放,程式結束時,可能會由作業系統**

3->暫存器區 用來儲存棧頂指標和指令指標

4->全域性區(靜態區) 全域性變數和靜態變數的儲存是放在一起的,初始化的全域性變數和靜態變數存放在一塊區域,未初始化的全域性變數和靜態變數在相鄰的另一塊區域,程式結束後由系統釋放

5->文字常量區 存放常量字串,程式結束後由系統釋放

6->程式**區 存放函式的二進位制**

棧區中的資料

應用程式啟動後,作業系統會為應用程式在棧區中開闢記憶體空間,用於存放區域性變數,以及函式的引數等

ios主線程棧區大小為1m,mac主線程棧區大小為8m

棧區中的變數由編譯器負責分配和釋放

棧區中的資料是以「棧」的形式管理的,先進後出(fibo)

訪問棧區中變數的效率高,不會出現記憶體碎片

棧區中的變數名(不帶*)相當於是指向棧區資料的指標別名,變數名可以簡化程式設計師的工作

堆區中的資料

1->由於棧區中的空間有限,ios的應用程式中,物件都是建立在堆中的

2->堆區包括系統記憶體和虛擬記憶體(硬碟快取),由所有正在執行的應用程式共享使用

3->堆區中的記憶體分配由作業系統負責,作業系統使用乙個鍊錶統一維護所有已經分配的記憶體記錄

4->由於堆區是由所有應用程式共享的,作業系統以匿名(只記錄記憶體位址和大小,不記錄具體型別)的方式記錄已經分配的記憶體區域

5->要訪問堆區中的資料,必須通過指標的方式才可以進行,指標的型別決定了訪問堆中資料的方式

6->當某一記憶體區域不再使用時,程式需要通知作業系統**該記憶體區域,從而可以保證該記憶體區域被其他程式再次使用,否則,該區域將永遠無法被再次分配,這就是傳說中的「記憶體洩露」

7->如果某一區域已經被釋放,仍然檢視訪問該區域,會提示「壞記憶體訪問」,這就是傳說中的「野指標訪問」

8->相比較棧區,堆區中的效率要低很多,同時容易出現記憶體碎片

9->相比較棧區,堆區中的訪問方式更加靈活,物件占用的記憶體也可以更大

bmp在記憶體中的存放

bmp 儲存影象 每張圖按大小來儲存,即影象的長寬畫素大小。如果一張的畫素是 240x320,則此影象在記憶體的存放是乙個 240x320的陣列,每個陣列的元素是int整形 整數占用4個byte 數位相機中所謂的支援500w畫素就是這個意思,代表它能處理多大的圖形色彩資訊的能力,畫素越高,需要處理時...

關於String在記憶體中的存放

string s1 abc 這個字串s1被賦予了值 abc 首先,查詢stringpool中有沒有 abc 這個值,如果不存在,那麼就將其存進去,如果已經存在,那麼就會被s1所呼叫。string s1 abc string s2 abc s1和s2所指向的物件是同乙個,以下 能夠看出來 system...

關於陣列在記憶體中的存放形式

char a 3 3 sizeof a 結果是9 9這個結果一直認為是 理所當然 但是當自己實現乙個二維陣列時,最簡單的方式就是 char test char malloc sizeof char row size int i 0 for ichar malloc sizeof char col s...