關於堆,棧的一些東西

2021-04-06 20:50:06 字數 1359 閱讀 8241

堆和棧的區別

1        預備知識—程式的記憶體分配

乙個由c/c++編譯的程式占用的記憶體分為以下幾個部分

u       1、棧區(stack)—   由編譯器自動分配釋放 (由編譯器在需要的時候分配,在不需要的時候自動清除) 。存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。

u       2、堆區(heap) —   一般由程式設計師分配釋放(由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete)(c中用malloc,c++中用new), 若程式設計師不釋放,程式結束時可能由os** 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。

u       自由儲存區,就是那些由malloc等分配的記憶體塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。

u       3、全域性區(靜態區)(static)—,全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。在c++裡面沒有這個區分了,他們共同占用同一塊記憶體區。 - 程式結束後有系統釋放

u       4、文字常量區  —常量字串就是放在這裡的,不允許修改。 程式結束後由系統釋放

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

l        更改堆疊大小的設定:

在vc6下面,預設的棧空間大小是1m(好像是,記不清楚了)。當然,我們可以修改:

開啟工程,依次操作選單如下:project->setting->link,在category 中選中output,然後在reserve中設定堆疊的最大值和commit。

注意:reserve最小值為4byte;commit是保留在虛擬記憶體的頁檔案裡面,它設定的較大會使棧開闢較大的值,可能增加記憶體的開銷和啟動時間。

1.1          例子程式

這是乙個前輩寫的,非常詳細

//main.cpp

int a = 0; 全域性初始化區

char *p1; 全域性未初始化區

main()

int b; 棧

char s = "abc"; 棧

char *p2; 棧

char *p3 = "123456"; 123456/0在常量區,p3在棧上。

static int c =0; 全域性(靜態)初始化區

p1 = (char *)malloc(10);

p2 = (char *)malloc(20);

分配得來得10和20位元組的區域就在堆區。

strcpy(p1, "123456"); 123456/0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成乙個地方。

關於VBO的一些東西

有時候你不得不承認,opengl的開發真的不如directx,特別對於入門的人來說,乙個簡單的概念可以讓我嚼上幾天不得騎姐。vbo可以說是opengl中里程碑似的東西,通過vbo我們可以把需要渲染的圖元的頂點資訊,直接上傳儲存在gpu的視訊記憶體中。由於最早的opengl不支援例項化繪製,導致在繪製...

關於爬蟲的一些東西

這幾天在寫乙個爬蟲,實際上整個過程和思路很簡單,難點在於繁雜的格式處理和一些未知的小問題,還有對python不太熟悉.基本上是邊學邊寫.記錄一些過程中值得記住的東西.關於python的 1.檔案的開頭要用 coding utf 8 2.建立資料夾可以要import os os.mkdir r new...

關於 media的一些東西

首先,media是css3的新增的標籤,主要的用途就是可以根據不同的螢幕你可以定義不同的樣式來實現響應式布局 先了解一下官方是怎麼定義的吧 使用 media 查詢,你可以針對不同的 型別定義不同的樣式。media 可以針對不同的螢幕尺寸設定不同的樣式,特別是如果你需要設定設計響應式的頁面,media...