關於C 使用指標 堆和棧的區別分析

2022-10-04 05:24:10 字數 1832 閱讀 4251

資料在記憶體的存放有以下幾種形式

1.棧區--由編譯器自動分配並且釋放,該區域一般存放函式的引數值,區域性變數的值等,

2.堆區--一般由程式設計師分配釋放,如果程式設計師不釋放,程式結束的時候才會被作業系統**,

3.暫存器區--用來儲存棧頂指標和指令指標

4.全域性去--也是靜態區,全域性變數和靜態變數都是儲存在一起的,初始化的全域性變數和靜態變數都儲存在一塊,為初始化的全域性變數和靜態變數在相鄰的另乙個區域,程式結束後由系統釋放。

5.文字常量區--常量字串就是放在這裡的,程式結束後由系統釋放,

6.程式**區--存放函式的二進位制**。

函式引數和區域性變數存放在棧中,函式執行結束或者返回系統就釋放了他們所占用的記憶體空間,但是全域性變數不會被系統釋放掉。全域性的只有在程式結束後才會被系統所釋放,而且由於全域性變數被所有的類成員和函式所共享,很容易被修改,為了解決這一問題

我們會使用堆

堆疊的區別

1.申請方式的不同

堆是程式設計師自己申請

而棧則是有程式判斷區域性變數或者函式 系統來自動分配

2.系統的響應不同

棧-只要棧的剩餘空間大於所申請的空間,系統將為程式提供記憶體,否則將提示棧溢位 overflow

堆- 系統收到程式中申請的控制項後,會遍歷乙個作業系統用來記錄記憶體控制項位址得鍊錶,當找到乙個空間大於所申請控制項的堆結點後就會將該節點從記錄記憶體空閒位址的鍊錶中刪除,並將結點的記憶體分配給程式,然後在這塊區域的首位址處記錄分配的大小,     這樣我們在使用delete來釋放記憶體的時候,delete才能正確的識別並刪除該記憶體區域的所有變數,另外我們申請的記憶體空間與堆結點上的記憶體空間不一定相等,這時候系統就會自動將堆結點上的多出來的一部分記憶體空qmrxluir間**到空閒鍊錶中

3、空間的大小不同

棧-在windows狀態下,棧是一塊連續的記憶體的區域,它的大小是2m,也有的說1m,總之這個數值是一編譯的時候就確定的常數,是由系統預先根據棧頂的位址和棧的最大容量定義好的,加入你的資料申請的記憶體空間超過棧的空間,就會提示overflow,所以別指望棧能夠儲存比較大的資料。

堆-堆是不連續的記憶體區域,各塊區域由鍊錶將他們串起來,這些串聯起來的記憶體空間叫做堆,他的大小是由系統中虛擬的記憶體來定的,因此獲得的空間比較大,而且獲得空間的方式也比較靈活。

4.執行效率的不同

棧-棧由系統自動分配,因此速度比較快,但是程式設計師不能對其進行操作。

堆-堆是程式設計師分配的內www.cppcns.com存, &nqmrxluirbsp;   一般速度比較慢,而且容易產生記憶體碎片,不過用起來很方便。

5.執行函式的不同

棧-在函式呼叫的時候,第乙個進棧的是被呼叫函式下一行的記憶體位址,其次是函式的引數,假如引數多餘乙個,那麼次序是從左往右,最後才是函式的區域性變數。

由於棧的先進後出原則,函式結束時正好相反,先是區域性變數先出棧,然後是引數,次序是從左向右,這時所偶的變數都出棧,指標自然的第乙個進棧的那行記憶體位址,也就是被呼叫函式的下一行記憶體位址,程式根據該位址跳轉到呼叫函式的下一行自動執行。

由於棧的先進後出原則,所以他永遠不可能產生記憶體碎片

堆--堆是一大堆不連續的記憶體區域,在系統中由鍊錶將他們串聯起來,因此在使用的時候必須由程式設計師來安排,他的機制是很複雜的,有時候為了分配一塊合適的記憶體,程式設計師需要按照一定的演算法在堆記憶體中搜尋可用的足夠大的空間,如果沒有滿足條件的空間,那麼就要向記憶體中發出申請一部分記憶體空間,這樣才能有機會分配足夠大的記憶體,然後將計算後的數值返回,顯然堆的執行效率比棧低很多,而且容易產生碎片,但是好處是堆可以儲存相當的大的資料,並且一些細節可以由程式設計師來安排。

以上就是堆疊的區別 但是在應用中的取捨還是具體問題具體分析

本文標題: 關於c++使用指標 堆和棧的區別分析

本文位址: /ruanjian/c/93910.html

關於棧和堆的區別

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

C 堆和棧區別

c 中,記憶體分為5個區 堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧 是由編譯器在需要時自動分配,不需要時自動清除的變數儲存區。通常存放區域性變數 函式引數等。堆 是由new分配的記憶體塊,由程式設計師釋放 編譯器不管 一般乙個new與乙個delete對應,乙個new與乙個delete對...

c 棧和堆的區別

在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個n...