堆疊記憶體和指標

2021-10-05 05:52:49 字數 2506 閱讀 7327

首先,堆疊都是記憶體。

棧是記憶體上面的,先進後出。堆是記憶體上面的,先進先出。

堆疊和記憶體的關聯

乙個32位程式,那麼32位位址只能表示4g的空間。

那麼棧就只有4g,而堆就有你的實際記憶體大小。這句話是錯的,正確的是,棧+堆+全域性靜態區=4g

注意:電腦核心使用2g,自己則只能使用最大2g,而執行緒棧大小為預設1m,則乙個程序最大為2048個執行緒。

如何區分程序棧或者執行緒棧:

第乙個執行崩潰,第二個執行成功。

#include

intmain()

#include

int a[

1000000];

//全域性變數

intmain()

1、棧區(stack sagment):由編譯器自動分配釋放,存放函式的引數的值,區域性變數的值等。在windows下,棧是向低位址擴充套件的資料結構,是一塊連續的記憶體的區域。這句話的意思是棧頂的位址和棧的最大容量是系統預先規定好的,在windows下,棧的大小是1m,如果申請的空間超過棧的剩餘空間時,將提示stack overflow。因此,能從棧獲得的空間較小。

2、堆區(heap sagment) : 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由系統** 。它與資料結構中的堆是兩回事。堆是向高位址擴充套件的資料結構,是不連續的記憶體區域。這是由於系統是用鍊錶來儲存的空閒記憶體位址的,自然是不連續的,而鍊錶的遍歷方向是由低位址向高位址。堆的大小受限於計算機系統中有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大。

3、全域性區(靜態區)

(data sagment):全域性變數和靜態變數的儲存區域是在一起的,程式結束後由系統釋放。資料區的大小由系統限定,一般很大,windows32位作業系統下可以達到2gb,因此不會溢位。32位作業系統的位址空間為4g,但是留給程式的只是2g,因為另外的2g留給作業系統自用。windows server 2003可以支援的全域性變數空間達到3g。

4、文字常量區:常量字串就是放在這裡的, 程式結束後由系統釋放。

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

綜上所述,區域性變數空間是很小的,我們開乙個a[

1000000

]就會導致棧溢位;而全域性變數空間一般比較大,因此大小超過1m的變數盡量宣告為全域性變數或者靜態變數。

指標為32位,但是每個指標指向的位址可能很大,所以堆上面的可使用的記憶體很大。

在棧裡面分配空間(例如int a)

在堆裡面分配空間(new int a)

指標的應用

指標存放的一塊記憶體空間的位址。

new申請的記憶體,必須得用delete釋放。

動態(new)建立的物件,返回的是記憶體塊的位址。

#include

"stdafx.h"

int*

fun(

)//(int*)函式返回乙個指標

intmain()

32位的解釋:

32位:這個一般用來指作業系統的位數,或者說是cpu上資料匯流排的引腳數

2的32次方:2 代表二進位制,因為計算機中電容表示資料 只能表示有 1 ,0 兩種情況,乙個電容代表兩種情況.n個電容就能代表2^n中情況.但是如果單單使用1個電容來代表乙個我們學術上使用的數字,不利於管理.所以一般使用8個電容,也就是8bits來代表乙個 學術上的數字.

咱們通常所說的1gb是1g的byte

8bits =

1 bytes

1mb =

1024 kb =

1024

*1024 b

1gb =

1024 mb =

1024

*1024 kb =

1024

*1024

*1024 b=2^

10*2^

10*2^

10 b =2^

30 b

4gb =2^

32 b

32位系統是說匯流排有32根子線組成, 一根子線指向乙個電容矩陣(可以將乙個矩陣認為 1byte ).乙個電容矩陣中可以容納8個電容,也就是 8bits所以32位的系統2^324g bytes<=> 4g bytes <=> 4g * 8 bits.理論上64位系統最大虛擬記憶體空間可以達到 2^64 gb (但是實際上並沒有這麼大)

棧大小與編譯器有關,通常棧大小為1m。但在平時應用程式中,由於函式會使用棧結果,所以只能用略小於1m大小的棧

對於全域性變數來說,與編譯器有關。預設情況下全域性變數陣列大小是2g。由於程式本身的應用,所以只能使用小於2g大小

對於heap來說,與程式是32位還是64位,以及編譯器都有關

32位程式可以申請的堆大小最大是2g。實際上只能小於2g,64位下也只能最多獲得4g記憶體,實際上小於4g

堆疊1

堆疊2

靜態記憶體和堆疊

一 記憶體基本構成 可程式設計內存在基本上分為這樣的幾大部分 靜態儲存區 堆區和棧區。他們的功能不同,對他們使用方式也就不同。靜態儲存區 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資料 全域性資料和常量。棧區 在執行函式時,函式內區域性變數的儲存單元都可以在...

斷點指標和任務堆疊指標

斷點資料 把任務被中止執行時的位置叫做斷點,把當時存放在cpu的pc psw和通用暫存器等各暫存器中的資料叫做斷點資料。斷點指標 任務被終止時 在pc暫存器中 cpu的當前程式執行指標。任務堆疊指標 指向任務堆疊棧頂的指標 乙個任務包含 任務控制塊 任務堆疊 任務 ucos進行任務切換時,osctx...

堆疊和記憶體的關係

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