? ? 經常在網上和地鐵上聽人討論一些技術,時而不時的說到了棧和堆,我就覺得很費解,這到底是什么呢?和我們日常的代碼有什么關系呢?下面說一些我的理解,可能有些錯誤的地方,還請批評指正。
一、概念
? ? ? 棧和堆是兩種內存分配的統稱。學過數據結構的同學都知道,數據結構中有隊列和棧。隊列是先進先出,就像排隊買票,先進去的先出來,后進入的后出來。棧呢,就是先進后出,怎么理解呢?就像把衣服放進箱子,先放進去的在最下面,最后才能拿出來。給我的感覺吧,就是隊列是有上下兩個門的,前門進后門出;棧呢就是只有一個門,最先進來的被前面的擋住了,只能最后出來。
? ? ?個人覺得,棧的概念與數據結構的棧類似。由于是先進后出,所以只需要指針向下移動,上面的地址沒有指針指向也就會被系統釋放掉了。堆呢,數據項并沒有固定的順序。是由程序員創建和釋放。如果程序員不釋放,則在程序結束的時候由系統釋放掉。
? ? ?OC中最常用的壓棧和出棧操作就是push和pop了。
二、申請方式
stack:由系統自動分配。?? 例如,聲明在函數中一個局部變量?? int?? b;?? 系統自動在棧中為b開辟空間heap:需要程序員自己申請,并指明大小,
在c中malloc函數?如p1?? =?? (char?? *)malloc(10);
在C++中用new運算符 ??如p2?? =?? new?? char[10];
但是注意p1、p2本身是在棧中的。
三、響應速度
棧更快因為所有的空閑內存都是連續的,因此不需要對空閑內存塊通過列表來維護。只是一個簡單的指向當前棧頂的指針。編譯器通常用一個專門的、快速的寄存器來實現。更重要的一點事是,隨后的棧上操作通常集中在一個內存塊的附近,這樣的話有利于處理器的高速訪問。
四、其他
棧和堆都是用來從底層操作系統中獲取內存的。
在多線程環境下每一個線程都可以有他自己完全的獨立的棧,但是他們共享堆。并行存取被堆控制而不是棧。