1. 程式人生 > >C++中全域性變數與區域性變數

C++中全域性變數與區域性變數

1、程式的記憶體分配

1.1、棧區

    由編譯器自動分配和釋放,存放函式的引數值,區域性變數等

    記憶體分配是連續分配的,當申請變數時,編譯器自動在其尾部分配一塊記憶體

1.2、堆區

    由程式猿分配和釋放(需要指明所需記憶體大小),如果忘記或是不釋放記憶體,程式結束時可能由OS釋放。

    記憶體分配是不連續的,類似連結串列,它們是不同區域的記憶體快通過指標連結在一起的

1.3、全域性區(靜態區)

    存放全域性變數和靜態變數,初始化的全域性變數和初始化的靜態變數放在一個區域,未初始化的全域性變數和未初始化的靜態變數放在一起

    程式結束後,系統釋放

1.4、文字常量區

    存放字串常量

    程式結束後,由系統釋放

1.5、程式區

    存放程式的二進位制程式碼

注意:

char *p=(char*)malloc(20);//p在棧區,分配的20位元組在堆區

char *s="123";//s在棧區,"123"在文字常量區

2、堆區與棧區的區別

2.1、分配方式

棧區由編譯器自動分配與釋放,而堆記憶體需要自己指定大小來進行分配與釋放

2.2、效率

分配效率:

1、棧中只要剩餘空間足夠大,編譯器將自動分配記憶體,所以效率比較高。但是程式設計師無法控制

2、對於堆記憶體,系統會維護一個空閒堆記憶體地址的連結串列,當在堆中申請一塊記憶體時,系統會遍歷此表,然後找到第一個大於所所申請空間的記憶體節點,將此記憶體分配給程式並將其從空閒連結串列中刪除。一般所分配的記憶體的首地址處都會記錄記憶體的大小,方便之後delete時釋放這些記憶體。同時,若找到的記憶體大於所需記憶體,系統會將空閒部分加入到空閒連結串列中。由此可見,堆記憶體的分配較慢,容易產生記憶體碎片。

存取效率:棧>堆

2.3、大小限制

1、棧:在window下棧是向低地址擴充套件的,棧頂地址和棧的最大容量是預設的,在window下是2M(也有說1M,總之在編譯時就確定的數值)。當所需記憶體超過棧中剩餘記憶體時,將會提示overflow。由此可見,棧的記憶體一般較小。

2、堆:堆是向高地址擴充套件的,不連續分配的空間(遍歷空閒連結串列時是從低地址到高地址的)。堆大小受限於計算機中有效虛擬記憶體。因此堆獲得的空間比較靈活,也比較大。

2.4、儲存內容

1、棧:在函式呼叫時,第一個進棧的是主函式中的此函式後的第一條可執行命令的地址,然後是函式的引數,其次是函式的區域性變數。函式呼叫結束時,區域性變數先出棧,然後是引數,最後是可執行命令的地址。程式由此地址繼續執行。

2、堆:堆的頭部記錄記憶體的大小,方便之後釋放。堆內其他內容由程式設計師決定。