C 堆和棧的區別(C 面試)

2021-10-24 09:49:40 字數 763 閱讀 4882

堆和棧的區別要從兩方面來講:

一、資料結構

1.棧記憶體是由系統分配,系統釋放,以函式為單位進行棧記憶體分配,函式棧幀、區域性變數、形參變數都儲存在棧記憶體上

堆記憶體是由使用者自己分配的,c語言用malloc/free進行申請/釋放記憶體,c++用new/delete進行申請/釋放記憶體,

由於堆需要使用者自己管理,因此記憶體很容易造成洩露,而棧不會。

2.棧的記憶體分配釋放速度快,效率高,記憶體都是連續的

堆記憶體的分配釋放相對來說效率低一些,記憶體不一定連續,容易產生記憶體碎片,但靈活性高

二、虛擬位址空間

首先,我們了解下c++中虛擬位址空間的布局

.text指令段:存放指令

.data資料段:已初始化的資料且初始化資料不為零

.bss資料段:未初始化的資料或初始化資料為零

共享庫stack棧區:所有函式的活動空間

命令列引數:傳遞引數

環境變數:可以拿到庫的標頭檔案

zone_dma直接記憶體訪問:針對資料流向,不經過暫存器

zone_normal常用部分:虛擬空間和記憶體的對映關係

zone_highmem高階記憶體:大檔案的對映

由上可得:

棧是由高位址像低位址擴充套件的連續記憶體,棧的大小一般為2m或者10m

堆是由低位址向高位址擴充套件的非連續記憶體,堆的大小影響因素較多,和系統虛擬位址記憶體的大小有關。

C 堆和棧區別

c 中,記憶體分為5個區 堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧 是由編譯器在需要時自動分配,不需要時自動清除的變數儲存區。通常存放區域性變數 函式引數等。堆 是由new分配的記憶體塊,由程式設計師釋放 編譯器不管 一般乙個new與乙個delete對應,乙個new與乙個delete對...

c 面試題 堆和棧的區別

二 說一說棧和堆的區別 1 記憶體分配方式不同 1 棧記憶體 儲存區域性變數 臨時變數 函式引數等,由編譯器自動分配和 記憶體,2 堆記憶體 由程式設計師手動分配和 記憶體,使用new運算子手動申請記憶體,必須使用delete手動釋放記憶體 2 申請大小限制 棧 在windows下,棧是向低位址擴充...

c 棧和堆的區別

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