基礎知識 初識棧和堆

? ? 經常在網上和地鐵上聽人討論一些技術,時而不時的說到了棧和堆,我就覺得很費解,這到底是什么呢?和我們日常的代碼有什么關系呢?下面說一些我的理解,可能有些錯誤的地方,還請批評指正。

一、概念

? ? ? 棧和堆是兩種內存分配的統稱。學過數據結構的同學都知道,數據結構中有隊列和棧。隊列是先進先出,就像排隊買票,先進去的先出來,后進入的后出來。棧呢,就是先進后出,怎么理解呢?就像把衣服放進箱子,先放進去的在最下面,最后才能拿出來。給我的感覺吧,就是隊列是有上下兩個門的,前門進后門出;棧呢就是只有一個門,最先進來的被前面的擋住了,只能最后出來。

? ? ?個人覺得,棧的概念與數據結構的棧類似。由于是先進后出,所以只需要指針向下移動,上面的地址沒有指針指向也就會被系統釋放掉了。堆呢,數據項并沒有固定的順序。是由程序員創建和釋放。如果程序員不釋放,則在程序結束的時候由系統釋放掉。

? ? ?OC中最常用的壓棧和出棧操作就是push和pop了。

二、申請方式

stack:由系統自動分配。?? 例如,聲明在函數中一個局部變量?? int?? b;?? 系統自動在棧中為b開辟空間heap:需要程序員自己申請,并指明大小,

在c中malloc函數?如p1?? =?? (char?? *)malloc(10);

在C++中用new運算符 ??如p2?? =?? new?? char[10];

但是注意p1、p2本身是在棧中的。

三、響應速度

棧更快因為所有的空閑內存都是連續的,因此不需要對空閑內存塊通過列表來維護。只是一個簡單的指向當前棧頂的指針。編譯器通常用一個專門的、快速的寄存器來實現。更重要的一點事是,隨后的棧上操作通常集中在一個內存塊的附近,這樣的話有利于處理器的高速訪問。

四、其他

棧和堆都是用來從底層操作系統中獲取內存的。

在多線程環境下每一個線程都可以有他自己完全的獨立的棧,但是他們共享堆。并行存取被堆控制而不是棧。

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

推薦閱讀更多精彩內容

  • 喜歡的話記得點贊 一、內存管理:移動設備的內存及其有限,每一個APP所能占用的內存是有限制的二、什么行為會增加AP...
    茉上心弦閱讀 2,038評論 1 12
  • 多線程、特別是NSOperation 和 GCD 的內部原理。運行時機制的原理和運用場景。SDWebImage的原...
    LZM輪回閱讀 2,035評論 0 12
  • 一、什么是人工神經網絡? 人工神經網絡(Artificial Neural Networks,ANN)系統是 20...
    虛竹夢姑閱讀 904評論 0 0
  • 每天我們都在不知不覺中種下了種子,這些種子又在不斷的開花結果,呈現出或喜,或悲,或怨,或恨等等的景象,很多時候...
    優優蓓蓓閱讀 132評論 0 1
  • Step1原文復述 把慢功夫花在真問題上,其實還是二八原理。我們要以慢為快,其實是把80%的時間花在20%的重要問...
    輕寒翦翦閱讀 249評論 0 0