日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是堆內(nèi)存與棧內(nèi)存?它們的分配和回收有什么特點(diǎn)?

xCb1_yikoulinux ? 來(lái)源:程序喵大人 ? 作者:程序喵大人 ? 2022-07-01 10:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

這篇文章分享一個(gè)面試中經(jīng)常被問(wèn)到的知識(shí)點(diǎn):堆內(nèi)存和棧內(nèi)存有什么區(qū)別?平時(shí)開(kāi)發(fā)應(yīng)該使用堆內(nèi)存還是棧內(nèi)存?

要回答這個(gè)問(wèn)題,我們首先需要知道什么是堆內(nèi)存,什么是棧內(nèi)存,它們的分配和回收有什么特點(diǎn)?

先介紹下棧內(nèi)存:

棧內(nèi)存是為線程留出的臨時(shí)空間,每個(gè)線程都有一個(gè)固定大小的棧空間,而且??臻g存儲(chǔ)的數(shù)據(jù)只能由當(dāng)前線程訪問(wèn),所以它是線程安全的。

??臻g的分配和回收是由系統(tǒng)來(lái)做的,我們不需要手動(dòng)控制。

當(dāng)一個(gè)函數(shù)調(diào)用時(shí),系統(tǒng)就會(huì)為該函數(shù)的調(diào)用分配??臻g,當(dāng)函數(shù)返回后,系統(tǒng)就會(huì)自動(dòng)回收這塊空間,同理,下次其它函數(shù)調(diào)用和返回,系統(tǒng)還是會(huì)自動(dòng)分配和回收空間。

那它是怎么分配和回收的呢?

可以看這兩個(gè)動(dòng)畫(huà)

9455e43c-f75f-11ec-ba43-dac502259ad0.gif

94ae6f6c-f75f-11ec-ba43-dac502259ad0.gif

??臻g的大小是固定的,它有一個(gè)水位線,標(biāo)識(shí)??臻g的分配狀態(tài),水位線里面的表示已經(jīng)分配,然后這個(gè)水位線會(huì)根據(jù)函數(shù)調(diào)用和返回的情況自動(dòng)調(diào)整。

這里可以看到,??臻g的分配和回收非常簡(jiǎn)單,只需要調(diào)整水位線位置就可以了,沒(méi)有任何多余操作。

那堆內(nèi)存呢?

我們平時(shí)在C語(yǔ)言C++中使用malloc和new分配的內(nèi)存就是堆內(nèi)存,堆內(nèi)存的一大特點(diǎn)就是大小不固定,可以動(dòng)態(tài)擴(kuò)容,空間由程序員動(dòng)態(tài)分配,更加靈活。

然而,既然有優(yōu)點(diǎn)也必然伴隨著缺點(diǎn)。

第一個(gè)缺點(diǎn)就是它容易產(chǎn)生內(nèi)存泄露,malloc出來(lái)的沒(méi)有free,new出來(lái)的如果沒(méi)有delete,都會(huì)產(chǎn)生內(nèi)存泄露,真正項(xiàng)目?jī)?nèi)存泄露產(chǎn)生的情況肯定比這個(gè)復(fù)雜的多。

第二個(gè)缺點(diǎn),容易產(chǎn)生內(nèi)存碎片,在分配和回收時(shí)需要對(duì)很多內(nèi)存碎片進(jìn)行整理,效率較低,具體可以看這個(gè)動(dòng)畫(huà)。

94c9bace-f75f-11ec-ba43-dac502259ad0.gif

所以才會(huì)有很多自定義的內(nèi)存分配器,但它肯定還是沒(méi)有??臻g分配回收速度快。

第三個(gè)缺點(diǎn),線程不安全,它不像棧內(nèi)存是線程獨(dú)立的,堆內(nèi)存可以被一個(gè)進(jìn)程內(nèi)所有的線程訪問(wèn),多線程操作就容易產(chǎn)生問(wèn)題,很多奇奇怪怪的操作就是這么引起的。

那什么變量存儲(chǔ)在棧上,什么存儲(chǔ)在堆上呢?普通的A a,這種就是都存儲(chǔ)在棧上,當(dāng)使用new和malloc分配的空間會(huì)存儲(chǔ)在堆上,看這個(gè)圖:

94ebba7a-f75f-11ec-ba43-dac502259ad0.jpg

new出來(lái)的實(shí)際空間是在堆上分配,然后在棧上開(kāi)辟一個(gè)指針大小的空間,這個(gè)空間有一個(gè)指針,指向堆上的那塊內(nèi)存,這樣給變量和堆內(nèi)存之間就關(guān)聯(lián)起來(lái)了。

那什么情況下使用棧內(nèi)存,什么情況下使用堆內(nèi)存呢?

我整理出來(lái)了一個(gè)表,貼在這里:

速度
空間管理 高效,不會(huì)產(chǎn)生碎片 會(huì)產(chǎn)生內(nèi)存碎片
訪問(wèn)權(quán)限 只能局部變量 可以訪問(wèn)全局變量
空間大小限制 操作系統(tǒng)限制 沒(méi)有特定的限制
內(nèi)存分配 連續(xù) 隨機(jī)分配
分配和釋放 編譯器指令自動(dòng)管理 程序員手動(dòng)管理
開(kāi)銷
主要問(wèn)題 空間小 內(nèi)存碎片
靈活性 固定大小 可以resize

這里可以根據(jù)實(shí)際需求來(lái)決定使用哪類內(nèi)存。

當(dāng)然,其實(shí)也不用關(guān)注那么多,我一般就是大內(nèi)存使用堆,局部變量小內(nèi)存使用棧。

這里還涉及到很多其它知識(shí)點(diǎn),比如進(jìn)程的內(nèi)存空間布局是怎么樣的,??臻g會(huì)不會(huì)污染、堆內(nèi)存具體是怎么分配和回收的。

具體在我的公眾號(hào)里搜索吧,里面有很多相關(guān)文章。

原文標(biāo)題:堆內(nèi)存和棧內(nèi)存的區(qū)別

文章出處:【微信公眾號(hào):一口Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:彭靜

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    9

    文章

    3240

    瀏覽量

    76535
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    183

    文章

    7648

    瀏覽量

    146248
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4423

    瀏覽量

    67905

原文標(biāo)題:堆內(nèi)存和棧內(nèi)存的區(qū)別

文章出處:【微信號(hào):yikoulinux,微信公眾號(hào):一口Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    LuatOS的內(nèi)存分配機(jī)制

    不同 LuatOS 硬件平臺(tái)在內(nèi)存布局上存在差異,Lua 運(yùn)行內(nèi)存、系統(tǒng)內(nèi)存與 PSRAM 擴(kuò)展內(nèi)存分配方式各有區(qū)別。部分型號(hào)將系統(tǒng)與腳本
    的頭像 發(fā)表于 04-16 12:37 ?160次閱讀
    LuatOS的<b class='flag-5'>內(nèi)存</b><b class='flag-5'>分配</b>機(jī)制

    DDR5內(nèi)存斷崖式下跌或引發(fā)踩踏式拋貨?

    內(nèi)存
    芯廣場(chǎng)
    發(fā)布于 :2026年03月30日 15:35:23

    MangoTree Halo Ultra「全新PXI」,標(biāo)配自動(dòng)糾錯(cuò)內(nèi)存#

    內(nèi)存
    芒果樹(shù)數(shù)字
    發(fā)布于 :2026年03月06日 15:59:34

    容易造成單片機(jī)內(nèi)存溢出的幾個(gè)陷阱介紹

    關(guān)于程序變量和內(nèi)存分配,都是需要我們時(shí)刻關(guān)注的問(wèn)題。我相信有不少人在這塊犯過(guò)很多的錯(cuò)誤,也可能說(shuō)明我們基礎(chǔ)不夠扎實(shí),編寫(xiě)程序的習(xí)慣也不夠好。 總結(jié)一下關(guān)于程序的變量和內(nèi)存方面的概念,雖然是屬于C語(yǔ)言
    發(fā)表于 01-23 07:25

    keil中c語(yǔ)言的動(dòng)態(tài)分配內(nèi)存

    于處理器的指令集中,效率很高,但是分配內(nèi)存容量有限。另外,當(dāng)函數(shù)運(yùn)行結(jié)束時(shí),區(qū)的空間會(huì)被自動(dòng)釋放。 (3)內(nèi)存映射段。該部分內(nèi)存主要用于
    發(fā)表于 01-21 06:04

    【「Linux 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(第 2 版)」閱讀體驗(yàn)】+讀深入理解Linux內(nèi)核內(nèi)存分配

    單位分配內(nèi)存。Slab分配器是建立在頁(yè)分配器的基礎(chǔ)上,從中獲取頁(yè)并將它們拆分為較小的內(nèi)存實(shí)體。k
    發(fā)表于 01-16 20:05

    嵌入式系統(tǒng)中,動(dòng)態(tài)分配內(nèi)存可能發(fā)生的問(wèn)題是什么?

    盡管不像非嵌入式計(jì)算機(jī)那么常見(jiàn),嵌入式系統(tǒng)還是有從(heap)中動(dòng)態(tài)分配內(nèi)存的過(guò)程的。 那么嵌入式系統(tǒng)中,動(dòng)態(tài)分配內(nèi)存可能發(fā)生的問(wèn)題是什
    發(fā)表于 12-22 09:42

    三種類型內(nèi)存的使用

    的,因?yàn)榈讓訑?shù)據(jù)會(huì)被默默刪除。自動(dòng)存儲(chǔ)通常被稱為“”。 分配的存儲(chǔ):運(yùn)行malloc() 會(huì)返回的內(nèi)存類型,這種內(nèi)存會(huì)一直保留,直到被 free() 函數(shù)釋放,所以可以被傳遞到任
    發(fā)表于 12-12 06:43

    從代碼執(zhí)行看單片機(jī)內(nèi)存分配

    需要分配給它們的空間大小(并且等于代碼所生成的.bin文件大?。硗釸W-data和ZI-data存儲(chǔ)在sram中,同樣兩者之和為單片機(jī)中sram需要分配給它們的空間大小。 另外,我們必然會(huì)想到區(qū)
    發(fā)表于 12-02 07:58

    的區(qū)別

    一個(gè)由C/C 編譯的程序占用的內(nèi)存分為以下幾個(gè)部分: 區(qū)(stack):由編譯器自動(dòng)分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的。
    的頭像 發(fā)表于 11-27 18:13 ?1268次閱讀

    如何在應(yīng)用程序調(diào)試期間分析使用情況

    隨著 AMD Vitis 統(tǒng)一軟件平臺(tái) 2021.2 的發(fā)布,Vitis 引入了一個(gè) Tcl 腳本,用于在應(yīng)用程序運(yùn)行的特定時(shí)間點(diǎn)協(xié)助查找內(nèi)存使用情況。該腳本已延續(xù)到后續(xù)的 Vitis 版本
    的頭像 發(fā)表于 10-24 16:54 ?1080次閱讀
    如何在應(yīng)用程序調(diào)試期間分析<b class='flag-5'>棧</b>和<b class='flag-5'>堆</b>使用情況

    WebGL/Canvas 內(nèi)存泄露分析

    的 JavaScript 對(duì)象未釋放要復(fù)雜得多。一個(gè)現(xiàn)代 WebGL/Canvas 應(yīng)用的內(nèi)存版圖實(shí)際上跨越了三個(gè)截然不同但又相互關(guān)聯(lián)的內(nèi)存區(qū)域: 圖 V8 引擎管理的 JavaScript (JS Heap
    的頭像 發(fā)表于 10-21 11:40 ?564次閱讀
    WebGL/Canvas <b class='flag-5'>內(nèi)存</b>泄露分析

    stm32cubeIDE使用malloc失敗是什么原因?

    我在stm32cubeIDE環(huán)境下,已經(jīng)分配了足夠的空間,但是我在的使用malloc分配內(nèi)存時(shí),一直
    發(fā)表于 06-09 07:24

    華強(qiáng)北TF卡回收 內(nèi)存回收

    深圳帝歐電子求購(gòu)內(nèi)存SD卡2G,4G,8G,16G,32G,64G,128G,256G,512G......新卡,舊卡,拆機(jī)卡都有收,價(jià)高同行回收三星內(nèi)存TF卡、金士頓TF卡、閃迪TF卡、東芝TF卡
    發(fā)表于 05-21 17:48
    新安县| 重庆市| 张家口市| 濉溪县| 高要市| 临泽县| 克什克腾旗| 阜阳市| 南汇区| 建宁县| 新丰县| 马龙县| 涞源县| 伊吾县| 昭通市| 铜山县| 贺州市| 沙洋县| 锡林浩特市| 石楼县| 民权县| 安义县| 密山市| 铁岭市| 东兴市| 达孜县| 玛曲县| 佛冈县| 弥渡县| 平江县| 罗定市| 蒲城县| 临江市| 本溪| 包头市| 建昌县| 和静县| 阳春市| 定边县| 黑山县| 蕲春县|