iOS知識梳理12:堆和棧

相關連接
iOS程序中的內存分配 棧區堆區全局區

內存分區

1.棧區(stack)

由編譯器自動分配并釋放,存放函數的參數值,局部變量等.
棧是系統數據結構,對應線程或進程是唯一的.
有點是快速高效,缺點是有時限,數據不靈活.(先進后出)

2.堆區(heap)

由程序員分配和釋放,如果程序員不釋放,程序結束時,可能會由操作系統回收
比如在iOS中alloc都是存放在堆中.
優點是靈活方便,數據適應面廣,但是效率有一定降低.(順序隨意)

3.全局區(靜態區)(static)

全局變量和靜態變量的存儲是放在一起的. 初始化的全局變量和靜態變量存放在一塊區域,未初始化的全局變量和靜態變量在相鄰的另一塊區域,程序結束后由系統釋放.
全局區又可以分為未初始化全局區(.bss)和初始化全局區(data段).

4.文字常量區

存放常量字符串,程序結束后由系統釋放

5.程序代碼區

存放函數的二進制代碼

堆棧申請后的系統響應

1.棧

存儲每一個函數在執行的時候都會向操作系統索要的資源,棧區就是函數運行時的內存,棧區中的變量由編譯器負責分配和釋放,內存隨著函數的運行分配,隨著函數的結束而釋放,由系統自動完成.

2.堆

1.首先應該知道操作系統有一個記錄空閑內存地址的鏈表.
2.當系統受到程序的申請時,會遍歷該鏈表,尋找第一個空間大于所有申請空間的堆結點,然后將該節點從空閑結點鏈表中刪除,并將該節點的空間分配給程序.
3.由于找到的堆節點的大小不一定正好等于申請的大小,系統會自動將多余的那部分重新放入空閑鏈表中.

申請大小的限制

1.棧

棧是向低地址擴展的數據結構,是一塊連續的內存空間.棧頂的地址和棧的最大容量是系統預先規定好的,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩余空間時,將會提示overflow,因此,能從棧獲得的空間較小.

2.堆

堆是向高地址擴展的數據結構,是不連續的內存區域.這是由于系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址.堆的大小受限于計算機系統中有效的虛擬內存.由此可見,堆獲得的空間比較靈活,也比較大...

內存分區圖
代碼塊
代碼塊在內存中的表現形式
代碼塊結束后,釋放結果

由圖和可以當代碼塊運行結束后,,系統會自動釋放棧中的a,b和儲存Car對象地址的c....不會釋放堆中的對象....所以需要我們需要手動釋放把對象release掉....

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容