国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是堆內存與棧內存?它們的分配和回收有什么特點?

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

掃碼添加小助手

加入工程師交流群

這篇文章分享一個面試中經常被問到的知識點:堆內存和棧內存有什么區別?平時開發應該使用堆內存還是棧內存?

要回答這個問題,我們首先需要知道什么是堆內存,什么是棧內存,它們的分配和回收有什么特點?

先介紹下棧內存:

棧內存是為線程留出的臨時空間,每個線程都有一個固定大小的棧空間,而且棧空間存儲的數據只能由當前線程訪問,所以它是線程安全的。

棧空間的分配和回收是由系統來做的,我們不需要手動控制。

當一個函數調用時,系統就會為該函數的調用分配棧空間,當函數返回后,系統就會自動回收這塊空間,同理,下次其它函數調用和返回,系統還是會自動分配和回收空間。

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

可以看這兩個動畫

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

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

棧空間的大小是固定的,它有一個水位線,標識棧空間的分配狀態,水位線里面的表示已經分配,然后這個水位線會根據函數調用和返回的情況自動調整。

這里可以看到,棧空間的分配和回收非常簡單,只需要調整水位線位置就可以了,沒有任何多余操作。

那堆內存呢?

我們平時在C語言C++中使用malloc和new分配的內存就是堆內存,堆內存的一大特點就是大小不固定,可以動態擴容,空間由程序員動態分配,更加靈活。

然而,既然有優點也必然伴隨著缺點。

第一個缺點就是它容易產生內存泄露,malloc出來的沒有free,new出來的如果沒有delete,都會產生內存泄露,真正項目內存泄露產生的情況肯定比這個復雜的多。

第二個缺點,容易產生內存碎片,在分配和回收時需要對很多內存碎片進行整理,效率較低,具體可以看這個動畫。

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

所以才會有很多自定義的內存分配器,但它肯定還是沒有棧空間分配回收速度快。

第三個缺點,線程不安全,它不像棧內存是線程獨立的,堆內存可以被一個進程內所有的線程訪問,多線程操作就容易產生問題,很多奇奇怪怪的操作就是這么引起的。

那什么變量存儲在棧上,什么存儲在堆上呢?普通的A a,這種就是都存儲在棧上,當使用new和malloc分配的空間會存儲在堆上,看這個圖:

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

new出來的實際空間是在堆上分配,然后在棧上開辟一個指針大小的空間,這個空間有一個指針,指向堆上的那塊內存,這樣給變量和堆內存之間就關聯起來了。

那什么情況下使用棧內存,什么情況下使用堆內存呢?

我整理出來了一個表,貼在這里:

速度
空間管理 高效,不會產生碎片 會產生內存碎片
訪問權限 只能局部變量 可以訪問全局變量
空間大小限制 操作系統限制 沒有特定的限制
內存分配 連續 隨機分配
分配和釋放 編譯器指令自動管理 程序員手動管理
開銷
主要問題 空間小 內存碎片
靈活性 固定大小 可以resize

這里可以根據實際需求來決定使用哪類內存。

當然,其實也不用關注那么多,我一般就是大內存使用堆,局部變量小內存使用棧。

這里還涉及到很多其它知識點,比如進程的內存空間布局是怎么樣的,棧空間會不會污染、堆內存具體是怎么分配和回收的。

具體在我的公眾號里搜索吧,里面有很多相關文章。

原文標題:堆內存和棧內存的區別

文章出處:【微信公眾號:一口Linux】歡迎添加關注!文章轉載請注明出處。

審核編輯:彭靜

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內存
    +關注

    關注

    9

    文章

    3210

    瀏覽量

    76369
  • C語言
    +關注

    關注

    183

    文章

    7644

    瀏覽量

    145598
  • 函數
    +關注

    關注

    3

    文章

    4417

    瀏覽量

    67509

原文標題:堆內存和棧內存的區別

文章出處:【微信號:yikoulinux,微信公眾號:一口Linux】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    MangoTree Halo Ultra「全新PXI」,標配自動糾錯內存#

    內存
    芒果樹數字
    發布于 :2026年03月06日 15:59:34

    容易造成單片機內存溢出的幾個陷阱介紹

    關于程序變量和內存分配,都是需要我們時刻關注的問題。我相信有不少人在這塊犯過很多的錯誤,也可能說明我們基礎不夠扎實,編寫程序的習慣也不夠好。 總結一下關于程序的變量和內存方面的概念,雖然是屬于C語言
    發表于 01-23 07:25

    keil中c語言的動態分配內存

    于處理器的指令集中,效率很高,但是分配內存容量有限。另外,當函數運行結束時,區的空間會被自動釋放。 (3)內存映射段。該部分內存主要用于
    發表于 01-21 06:04

    【「Linux 設備驅動開發(第 2 版)」閱讀體驗】+讀深入理解Linux內核內存分配

    單位分配內存。Slab分配器是建立在頁分配器的基礎上,從中獲取頁并將它們拆分為較小的內存實體。k
    發表于 01-16 20:05

    嵌入式系統中,動態分配內存可能發生的問題是什么?

    盡管不像非嵌入式計算機那么常見,嵌入式系統還是有從(heap)中動態分配內存的過程的。 那么嵌入式系統中,動態分配內存可能發生的問題是什
    發表于 12-22 09:42

    三種類型內存的使用

    的,因為底層數據會被默默刪除。自動存儲通常被稱為“”。 分配的存儲:運行malloc() 會返回的內存類型,這種內存會一直保留,直到被 free() 函數釋放,所以可以被傳遞到任
    發表于 12-12 06:43

    從代碼執行看單片機內存分配

    需要分配給它們的空間大小(并且等于代碼所生成的.bin文件大小),另外RW-data和ZI-data存儲在sram中,同樣兩者之和為單片機中sram需要分配給它們的空間大小。 另外,我們必然會想到
    發表于 12-02 07:58

    的區別

    一個由C/C 編譯的程序占用的內存分為以下幾個部分: 區(stack):由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的
    的頭像 發表于 11-27 18:13 ?1084次閱讀

    如何在應用程序調試期間分析使用情況

    隨著 AMD Vitis 統一軟件平臺 2021.2 的發布,Vitis 引入了一個 Tcl 腳本,用于在應用程序運行的特定時間點協助查找內存使用情況。該腳本已延續到后續的 Vitis 版本
    的頭像 發表于 10-24 16:54 ?892次閱讀
    如何在應用程序調試期間分析<b class='flag-5'>棧</b>和<b class='flag-5'>堆</b>使用情況

    WebGL/Canvas 內存泄露分析

    的 JavaScript 對象未釋放要復雜得多。一個現代 WebGL/Canvas 應用的內存版圖實際上跨越了三個截然不同但又相互關聯的內存區域: 圖 V8 引擎管理的 JavaScript (JS Heap
    的頭像 發表于 10-21 11:40 ?408次閱讀
    WebGL/Canvas <b class='flag-5'>內存</b>泄露分析

    華強北TF卡回收 內存回收

    深圳帝歐電子求購內存SD卡2G,4G,8G,16G,32G,64G,128G,256G,512G......新卡,舊卡,拆機卡都有收,價高同行回收三星內存TF卡、金士頓TF卡、閃迪TF卡、東芝TF卡
    發表于 05-21 17:48

    如何使用LAX_CODEGEN啟用動態內存分配

    我目前正在探索NXP_MBDToolbox_LAX。lax_codegen 生成的代碼基于靜態分配。我想管理大型向量,如何使用 LAX_CODEGEN 啟用動態內存分配
    發表于 04-10 08:09

    如何查看S32DS中S32平臺的內存分配

    大家好,我正在使用 s32DS for s32 平臺,我想查看我的項目的內存分配。我想知道分配給對象的內存以及它們
    發表于 04-09 07:30

    golang內存分配

    作者:錢文 Go 的分配采用了類似 tcmalloc 的結構.特點: 使用一小塊一小塊的連續內存頁, 進行分配某個范圍大小的內存需求. 比如
    的頭像 發表于 03-31 15:00 ?514次閱讀
    golang<b class='flag-5'>內存</b><b class='flag-5'>分配</b>

    快速搞懂C語言程序內存分區!

    到動態分配的數據等內容。(內存分區圖示)理解這些內存分區的結構和特性,不僅有助于編寫更高效的代碼,還能幫助排查和解決如段錯誤、內存泄漏、
    的頭像 發表于 03-14 17:37 ?1568次閱讀
    快速搞懂C語言程序<b class='flag-5'>內存</b>分區!