堆與棧的較量

2021-06-16 08:40:40 字數 957 閱讀 3014

資料在記憶體中的存放方式

棧:由編譯器自動分配,並自動**,該區域一般存放函式的引數,區域性變數等。

堆:一般由程式設計師手動分配,並手動撤銷。若程式設計師不釋放,程式結束時可能由作業系統**。

全域性區:全域性變數和靜態變數是儲存在一起的,初始化的全域性變數和靜態變數放在乙個區域,未初始化的放在相鄰的區域。程式結束後由系統釋放。

文字常量區:存放常量字串,程式結束後由系統釋放。

程式**區:存放函式體的二進位制**。

堆與棧的區別:

1、棧是由系統自動分配並釋放,堆是由程式設計師手動申請並手動釋放,程式接收後由系統清空。

2、只要的棧的剩餘空間大於所申請的空間,系統就會為程式提供記憶體,否則提示overflow,也就是棧溢位。堆的空間申請時系統搜尋位址鍊錶上空閒位址大於申請空間的記憶體塊,並在該記憶體首位址處記錄申請的記憶體的大小,以便於刪除。

3、空間大小的不同。棧是連續的區域,堆是不連續的區域。

4、執行效率不同。棧由於是自動分配,因此比較快。相反堆的速度較慢。

為了保持隱蔽性,堆中的記憶體單元都是匿名的,因此必須現在堆中申請乙個記憶體單元的位址,然後把它儲存在乙個指標中,這樣只有使用該指標才能訪問到該記憶體單元中的資料。採用匿名的方式來訪問而不是使用公開的全域性變數優點是只有使用特定的指標才能訪問特定的資料,這樣就避免了任何試圖修改它的操作。

使用完堆中的資料後要手動釋放,因為指向堆中資料的指標是區域性變數,當該指標的函式結束並返回時,指標也就消失了,那麼堆中的資料就無法得到釋放。

#includeusing namespace std;

int main()

在堆中申請空間之後,呼叫delete刪除的是 指標指向的堆中記憶體,指標還可以使用,但是指標不可以直接刪除,因為這時指標指向的內容為空,要在刪除指標前先p=0;然後就可以刪除指標了。

物件在堆與棧中的不同:在棧中的物件在超出作用域後就析構,而在堆中的要手動釋放。

棧 與 堆 的區別

預備知識 堆與棧有什麼區別?一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束...

堆與棧的區別

堆與棧有什麼區別?一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由o...

堆與棧的區別

一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結...