記憶體四區
乙個c/c++程式所占用的系統記憶體共分為4個部分
1、棧區(也叫堆疊,stack):存放所有的區域性
變數,函式
形參,由系統進行自動完成。棧的大小:在linux中為8兆, 在windows中為2兆。
2、堆區(heap):由程式設計師自己管理的,在程式執行過程中進行動態分配的記憶體。你可以用malloc()系列函式進行動態的新增和釋放。堆的大小並不是固定的,可以動態的擴張或者收縮。
3、資料區:資料區中分兩個部分
第一部分—未初始化的資料段(bss):存放全域性和靜態(全域性靜態、區域性靜態)的未初始化的變數
第二部分—資料段(data) :存放程式中明確被初始化的全域性變數和靜態變數(包括全域性靜態變數和區域性靜態變數)
4、**段(text):存放所有可執行**(包括程式指令、常量字串等)都載入到**區。這塊內存在程式執行期間不變。
棧和堆的區別
以下從6個方面來比較兩者
1、增長方向:棧:從上往下
堆:從下往上
2、管理方式:棧:編譯器自動管理,無需程式設計師控制
堆:堆空間的申請和釋放工作由程式設計師控制,但容易出現記憶體洩漏。
3、是否產生碎片:棧由系統操作控制不產生碎片
堆:由於頻繁的malloc/free,造成記憶體空間的不連續,造成大量的碎片空間,程式效率低。
4、分配方式:棧:由編譯器完成分配釋放,棧的動態分配由alloca()函式完成,由編譯器申請和釋放。
堆:利用malloc()系列函式動態申請分配,由free()函式釋放。
5、空間大小: 棧:很小。
堆:比棧要大的多。
6、分配效率:棧:很高:計算機會在底層對棧提供支援,分配專門的暫存器存放棧的位址。壓棧、出棧都有專門的指令執行。
堆:比棧低的多:為了分配一塊記憶體,庫函式會按演算法在堆內搜尋可用的足夠大的空間,沒有的情況下需要作業系統來重新整理記憶體空間。
記憶體四區中堆區見解
堆區 由程式設計師分配釋放 若程式設計師不釋放,則在程式結束後自動釋放。堆區就像定義一樣,由程式設計師自己分配,這裡我們使用malloc函式來分配空間 include include include char getmem int num char p null p char malloc size...
記憶體四區之堆疊區別
一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它...
記憶體中堆區和棧區的區別
從下面五個方面說一下記憶體中堆和棧的區別 1 管理方式 對於棧來講,是由編譯器自動管理,無需我們手工控制 對於堆來說,釋放工作由程式設計師控制,容易產生memory leak。2 申請大小 能從棧獲得的空間較小,堆是向高位址擴充套件的資料結構,是不連續的記憶體區域。堆的大小受限於計算機系統中有效的虛...