1.乙個由c/c++編譯的程式占用的記憶體:
①棧區stack
函式引數,區域性變數等
②堆區heap
malloc new 自動申請的記憶體
③全域性區(靜態區)static
bss區 沒有初始化或初始化位0的全域性/靜態變數
data區 初始化的全域性/靜態變數(非const)
④文字常量區rodata
字串、const修飾的變數
⑤程式**區text
函式體的二進位制**
2.堆和棧的區別
①申請方式:
ⅰ棧空間:②申請後系統的響應:編譯器自動分配和釋放
ⅱ堆空間:
程式設計師分配和釋放,若未釋放,程式結束時os**。
ⅰ棧:③申請空間大小限制:只要棧剩餘空間大於所申請的空間,系統就為程式提供記憶體,否則報異常棧溢位
ⅱ堆:系統有乙個記錄空閒記憶體位址的鍊錶,系統收到程式的申請,將遍歷該鍊錶,尋找第乙個空間大於所申請的空間的堆結點,從空閒結點鍊錶中刪除該結點。
對於大多數系統,會在這塊空間的首位址上記錄申請的空間的大小,便於釋放。
④申請效率:
ⅰ棧:⑤儲存的內容程式自動分配,速度較快。
ⅱ堆:程式設計師分配,速度較慢,容易產生記憶體碎片,但方便。
windows下最好的方式使用virtualalloc
ⅱ棧:堆的頭部用乙個位元組記錄申請空間的大小。
⑥訪問效率:
ⅰ棧:較快ⅱ堆:較慢
c c 中堆疊的區別
這個文章不錯,所以轉一下!共冕!一直就搞不清出這個問題,今天上網想起來,隨即搜了搜,找到了一些資料。不知源作者是誰。姑且 拿來主義 一下,呵呵。一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變...
堆,棧,堆疊的區別
乙個程式一般分為3段 text段,data段,bss段 text段 就是放程式 的,編譯時確定,唯讀,data段 存放在編譯階段 而非執行時 就能確定的資料,可讀可寫 就是通常所說的靜態儲存區,賦了初值的全域性變數和靜態變數存放在這個區域,常量也存放在這個區域 bss段 定義而沒有賦初值的全域性變數...
佇列 堆 棧 堆疊的區別?
佇列是先進先出 就像一條路,有乙個入口和乙個出口,先進去的就可以先出去。而棧就像乙個箱子,後放的在上邊,所以後進先出。程序中每個執行緒都有自己的堆疊,這是一段執行緒建立時保留下的位址區域。我們的 棧記憶體 即在此。至於 堆 記憶體,我個人認為在未用new定義時,堆應該就是未 保留 未 提交 的自由空...