[C/C++] 棧內(nèi)存 & 堆內(nèi)存 區(qū)別

1. 簡(jiǎn)要說(shuō)明

C語(yǔ)言中的內(nèi)存一般可以被劃分為以下幾個(gè)區(qū)域:

  • 棧(Stack):由編譯器自動(dòng)分配釋放歹苦,存放函數(shù)的參數(shù)值,局部變量的值等摩渺。其操作方式類(lèi)似于數(shù)據(jù)結(jié)構(gòu)中的棧掰吕。
  • 堆(Heap):一般由程序員分配釋放,若程序員不釋放呜笑,程序結(jié)束時(shí)可能由操作系統(tǒng)回收夫否。相比棧來(lái)說(shuō),堆的使用是靈活的叫胁,但也相對(duì)復(fù)雜凰慈。

下面詳細(xì)解釋一下棧內(nèi)存和堆內(nèi)存的主要區(qū)別:

  • 管理方式:堆內(nèi)存由程序員管理,需要手動(dòng)申請(qǐng)和釋放曹抬;棧內(nèi)存由編譯器自動(dòng)管理溉瓶,無(wú)需手動(dòng)操作急鳄。
  • 生存期:棧內(nèi)存中的變量在函數(shù)執(zhí)行完后會(huì)自動(dòng)釋放;堆內(nèi)存中的變量需要程序員手動(dòng)釋放堰酿,否則只有在程序運(yùn)行結(jié)束后才會(huì)被操作系統(tǒng)回收疾宏。
  • 空間大小:棧內(nèi)存的大小通常比較小触创,一般只有幾MB坎藐;堆內(nèi)存的大小遠(yuǎn)大于棧內(nèi)存,通澈甙螅可以達(dá)到GB級(jí)別岩馍。
  • 碎片問(wèn)題:頻繁的新建、刪除堆內(nèi)存中的數(shù)據(jù)會(huì)造成內(nèi)存空間的不連續(xù)抖韩,產(chǎn)生內(nèi)存碎片蛀恩;棧內(nèi)存由于是由系統(tǒng)連續(xù)分配,因此不會(huì)產(chǎn)生內(nèi)存碎片茂浮。
  • 分配效率:棧內(nèi)存的分配效率高于堆內(nèi)存双谆,因?yàn)椴僮飨到y(tǒng)僅需要移動(dòng)棧頂指針,而堆內(nèi)存的分配則需要在內(nèi)存中尋找足夠大的可用空間席揽。
  • 存儲(chǔ)內(nèi)容:棧內(nèi)存主要存儲(chǔ)局部變量顽馋、函數(shù)參數(shù)等;堆內(nèi)存用于存儲(chǔ)需要長(zhǎng)時(shí)間存在或者大小在運(yùn)行時(shí)決定的數(shù)據(jù)幌羞。
    總的來(lái)說(shuō)寸谜,兩者各有優(yōu)缺點(diǎn),使用時(shí)應(yīng)視實(shí)際需要選擇合適的存儲(chǔ)方式属桦。

2.代碼舉例說(shuō)明

2.1 棧內(nèi)存

在這個(gè)例子中熊痴,stack_var 就是一個(gè)棧上的變量。當(dāng) show 函數(shù)被調(diào)用時(shí)地啰,變量 stack_var 會(huì)被創(chuàng)建在棧上愁拭,當(dāng)函數(shù)返回時(shí)讲逛,這個(gè)變量會(huì)被自動(dòng)銷(xiāo)毀亏吝。

#include <stdio.h>

void show() {
    int stack_var = 10;
    printf("Stack variable value: %d\n", stack_var);
}

int main() {
    show();
    return 0;
}

2.2 堆內(nèi)存

在這個(gè)例子中,heap_var 是一個(gè)指向堆內(nèi)存的指針盏混。使用 malloc 函數(shù)蔚鸥,我們可以在堆上申請(qǐng)內(nèi)存,然后通過(guò) heap_var 指針訪問(wèn)和操作這塊內(nèi)存许赃。當(dāng)我們不再需要這塊內(nèi)存時(shí)止喷,需要使用 free 函數(shù)將其釋放,否則會(huì)導(dǎo)致內(nèi)存泄漏混聊。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *heap_var = malloc(sizeof(int));  // 在堆上申請(qǐng)內(nèi)存
    *heap_var = 20;
    printf("Heap variable value: %d\n", *heap_var);
    free(heap_var);  // 釋放堆上的內(nèi)存
    return 0;
}

3. 相關(guān)問(wèn)題

3.1 堆內(nèi)存分配 & 堆排序關(guān)系

"堆內(nèi)存分配"和"堆排序"都使用了"堆"這個(gè)詞弹谁,但它們所指的"堆"其實(shí)是兩個(gè)完全不同的概念。

  • 堆內(nèi)存分配:在這里的"堆",指的是操作系統(tǒng)中用于動(dòng)態(tài)內(nèi)存分配的一種數(shù)據(jù)區(qū)预愤。當(dāng)程序運(yùn)行時(shí)沟于,如果需要?jiǎng)討B(tài)地分配內(nèi)存,通常會(huì)從這個(gè)"堆"中申請(qǐng)植康。堆內(nèi)存的大小通常不是在編譯時(shí)確定的旷太,而是在運(yùn)行時(shí)根據(jù)需要進(jìn)行動(dòng)態(tài)分配。這種動(dòng)態(tài)分配的內(nèi)存销睁,需要程序員手動(dòng)管理其生命周期供璧,包括申請(qǐng)內(nèi)存和釋放內(nèi)存。
  • 堆排序:在這里的"堆"冻记,指的是一種特殊的數(shù)據(jù)結(jié)構(gòu)——堆(Heap)睡毒。堆是一種完全二叉樹(shù),它必須滿足堆的性質(zhì):即任一節(jié)點(diǎn)的值都必須大于或等于(或小于或等于)其子節(jié)點(diǎn)的值冗栗。根據(jù)這個(gè)性質(zhì)不同吕嘀,堆可以分為大頂堆和小頂堆。堆排序就是利用堆這種數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)的一種排序算法贞瞒。

所以說(shuō)偶房,"堆內(nèi)存分配"和"堆排序"兩者之間并沒(méi)有直接關(guān)系。它們都使用了"堆"這個(gè)詞军浆,但所指的概念和用途都大不相同棕洋。

3.2 堆內(nèi)存分配,需要用到堆排序算法嗎乒融?

在操作系統(tǒng)中掰盘,"堆"是指用于動(dòng)態(tài)內(nèi)存分配的一塊區(qū)域,而不是指數(shù)據(jù)結(jié)構(gòu)中的"堆"赞季。因此愧捕,堆內(nèi)存分配并不需要使用到堆排序算法。

堆內(nèi)存分配的過(guò)程是這樣的:當(dāng)程序需要一塊動(dòng)態(tài)內(nèi)存時(shí)申钩,它會(huì)向操作系統(tǒng)發(fā)送一個(gè)請(qǐng)求次绘,操作系統(tǒng)會(huì)在堆中找到一塊足夠大的、連續(xù)的內(nèi)存塊撒遣,并將其分配給程序邮偎。這個(gè)過(guò)程涉及到的主要問(wèn)題是內(nèi)存碎片的管理和最佳適應(yīng)(best-fit)、首次適應(yīng)(first-fit)等分配策略义黎,而與堆排序算法無(wú)關(guān)禾进。

總的來(lái)說(shuō),盡管"堆內(nèi)存"和"堆排序"都包含了"堆"這個(gè)詞廉涕,但它們?cè)谟?jì)算機(jī)科學(xué)中代表的是兩個(gè)完全不同的概念泻云,它們之間并沒(méi)有直接的關(guān)系艇拍。

參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宠纯,隨后出現(xiàn)的幾起案子淑倾,更是在濱河造成了極大的恐慌,老刑警劉巖征椒,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娇哆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡勃救,警方通過(guò)查閱死者的電腦和手機(jī)碍讨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蒙秒,“玉大人勃黍,你說(shuō)我怎么就攤上這事≡谓玻” “怎么了覆获?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瓢省。 經(jīng)常有香客問(wèn)我弄息,道長(zhǎng),這世上最難降的妖魔是什么勤婚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任摹量,我火速辦了婚禮,結(jié)果婚禮上馒胆,老公的妹妹穿的比我還像新娘缨称。我一直安慰自己,他們只是感情好祝迂,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布睦尽。 她就那樣靜靜地躺著,像睡著了一般型雳。 火紅的嫁衣襯著肌膚如雪当凡。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,337評(píng)論 1 310
  • 那天四啰,我揣著相機(jī)與錄音宁玫,去河邊找鬼粗恢。 笑死柑晒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的眷射。 我是一名探鬼主播匙赞,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼佛掖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了涌庭?” 一聲冷哼從身側(cè)響起芥被,我...
    開(kāi)封第一講書(shū)人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坐榆,沒(méi)想到半個(gè)月后拴魄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡席镀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年匹中,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豪诲。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡顶捷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屎篱,到底是詐尸還是另有隱情服赎,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布交播,位于F島的核電站重虑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏秦士。R本人自食惡果不足惜嚎尤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伍宦。 院中可真熱鬧芽死,春花似錦、人聲如沸次洼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)卖毁。三九已至揖曾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亥啦,已是汗流浹背炭剪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翔脱,地道東北人奴拦。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像届吁,于是被迫代替她去往敵國(guó)和親错妖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绿鸣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容