標籤:os 使用 io 資料 代碼 工作 管理 c 應用
在電腦系統中,啟動並執行應用程式的資料都是儲存在記憶體之中
不同類型的資料,儲存的記憶體地區不同,其中包括:
1->棧區(stack) 由編譯器自動分配並釋放,一般存放函數的參數值,局部變數等
2->堆區(heap) 由程式員分配和釋放,如果程式員不釋放,程式結束時,可能會由作業系統回收
3->寄存器區 用來儲存棧頂指標和指令指標
4->全域區(靜態區) 全域變數和靜態變數的儲存是放在一起的,初始化的全域變數和靜態變數存放在一塊地區,未初始化的全域變數和靜態變數在相鄰的另一塊地區,程式結束後由系統釋放
5->文字常量區 存放常量字串,程式結束後由系統釋放
6->程式碼區 存放函數的二進位代碼
棧區中的資料
應用程式啟動後,作業系統會為應用程式在棧區中開闢記憶體空間,用於存放局部變數,以及函數的參數等
iOS主線程棧區大小為1M,MAC主線程棧區大小為8M
棧區中的變數由編譯器負責分配和釋放
棧區中的資料是以“棧”的形式管理的,先進後出(FIBO)
訪問棧區中變數的效率高,不會出現記憶體片段
棧區中的變數名(不帶*)相當於是指向棧區資料的指標別名,變數名可以簡化程式員的工作
堆區中的資料
1->由於棧區中的空間有限,iOS的應用程式中,對象都是建立在堆中的
2->堆區包括系統記憶體和虛擬記憶體(硬碟緩衝),由所有正在啟動並執行應用程式共用使用
3->堆區中的記憶體配置由作業系統負責,作業系統使用一個鏈表統一維護所有已經分配的記憶體記錄
4->由於堆區是由所有應用程式共用的,作業系統以匿名(只記錄記憶體位址和大小,不記錄具體類型)的方式記錄已經分配的記憶體地區
5->要訪問堆區中的資料,必須通過指標的方式才可以進行,指標的類型決定了訪問堆中資料的方式
6->當某一記憶體地區不再使用時,程式需要通知作業系統回收該記憶體地區,從而可以保證該記憶體地區被其他程式再次使用,否則,該地區將永遠無法被再次分配,這就是傳說中的“記憶體泄露”
7->如果某一地區已經被釋放,仍然視圖訪問該地區,會提示“壞記憶體訪問”,這就是傳說中的“野指標訪問”
8->相比較棧區,堆區中的效率要低很多,同時容易出現記憶體片段
9->相比較棧區,堆區中的訪問方式更加靈活,對象佔用的記憶體也可以更大
資料在記憶體中的存放