在計算機系統中,執行的應用程式的資料都是儲存在記憶體之中
不同型別的資料,儲存的記憶體區域不同,其中包括:
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...