在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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】歡迎添加關注!文章轉載請注明出處。

審核編輯:彭靜

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

    關注

    8

    文章

    3064

    瀏覽量

    74383
  • C語言
    +關注

    關注

    180

    文章

    7615

    瀏覽量

    137851
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    63022

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

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

收藏 人收藏

    評論

    相關推薦

    談JVM xmx, xms等內存相關參數合理性設置

    的,提高內存占用(Memory Footprint)就有可能同時優化這兩個標的,這篇文章就來聊聊內存相關內容。 內存占用一般指應用運行需要的所有內存,包括
    的頭像 發表于 10-10 14:42 ?680次閱讀

    邏輯內存和物理內存的區別

    邏輯內存和物理內存是計算機系統中兩個重要的概念,它們在計算機的運行和數據處理中起著至關重要的作用。 1. 物理內存(Physical Memory) 物理
    的頭像 發表于 09-27 15:38 ?971次閱讀

    內存緩沖區和內存的關系

    內存緩沖區和內存之間的關系是計算機體系結構中一個至關重要的方面,它們共同協作以提高數據處理的效率和系統的整體性能。
    的頭像 發表于 09-10 14:38 ?787次閱讀

    反射內存卡的優勢與特點

    特點1.高速數據傳輸:?反射內存卡能夠實現極高的數據傳輸速度,?這是其最顯著的特點之一。?數據傳輸速度可達到微秒級或百納秒級,?大大提升了數據處理的實時性。?這種高速傳輸能力使得反射內存
    的頭像 發表于 09-05 16:28 ?417次閱讀
    反射<b class='flag-5'>內存</b>卡的優勢與<b class='flag-5'>特點</b>

    轉載 golang內存分配

    Go 的分配采用了類似 tcmalloc 的結構.特點: 使用一小塊一小塊的連續內存頁, 進行分配某個范圍大小的內存需求. 比如某個連續 8
    的頭像 發表于 09-05 14:12 ?319次閱讀
    轉載 golang<b class='flag-5'>內存</b><b class='flag-5'>分配</b>

    內存管理的硬件結構

    常見的內存分配函數有malloc,mmap等,但大家有沒有想過,這些函數在內核中是怎么實現的?換句話說,Linux內核的內存管理是怎么實現的?
    的頭像 發表于 09-04 14:28 ?407次閱讀
    <b class='flag-5'>內存</b>管理的硬件結構

    內存時鐘和內存條有什么不同

    在探討內存時鐘(Memory Clock)和內存條(Memory Module)的不同時,我們首先需要明確這兩個概念的基本定義和它們在計算機系統中的角色。以下是對這兩個概念的詳細解析,以及它們
    的頭像 發表于 09-04 11:45 ?1879次閱讀

    如何自定義內存控制器的設置

    在FreeRTOS中自定義內存控制器的設置,主要涉及到內存分配策略的選擇和配置。FreeRTOS提供了多種內存分配策略,如heap_1、he
    的頭像 發表于 09-02 14:28 ?587次閱讀

    堆棧和內存的基本知識

    本文主要聊聊關于堆棧的內容。包括堆棧和內存的基本知識。常見和堆棧相關的 bug,如溢出,內存泄漏,內存
    的頭像 發表于 08-29 14:10 ?586次閱讀
    堆棧和<b class='flag-5'>內存</b>的基本知識

    如何使用SystemView的監控功能

    應用中監視所有,分析它們的使用情況,并展示收集到的信息,使用戶能夠查看的負載情況,發現潛在的內存泄漏,跟蹤內存使用峰值等等。
    的頭像 發表于 08-09 18:07 ?906次閱讀
    如何使用SystemView的<b class='flag-5'>堆</b>監控功能

    FreeRTOS如何在中斷中調用內存分配函數?

    最近在玩FreeRTOS,遇到一個問題,就是不知如何在中斷中調用內存分配函數。pvPortMalloc函數中會調用xTaskResumeAll,而這個函數不能再中斷調用,所以請問在中斷中進行內存
    發表于 05-08 08:25

    你知道嗎? 51單片機也有動態內存分配

    、realloc、free。他們的頭文件在中,所以使用內存管理必須包含該頭文件。二、使用方法51單片機需要使用內存管理API必須要手動調用初始化內存管理函數:init_
    的頭像 發表于 04-26 08:10 ?1682次閱讀
    你知道嗎? 51單片機也有動態<b class='flag-5'>內存</b><b class='flag-5'>分配</b>

    C語言內存泄漏問題原理

    內存泄漏問題只有在使用內存的時候才會出現,內存不存在內存泄漏問題,因為
    發表于 03-19 11:38 ?580次閱讀
    C語言<b class='flag-5'>內存</b>泄漏問題原理

    Linux內核內存管理之內核非連續物理內存分配

    我們已經知道,最好將虛擬地址映射到連續頁幀,從而更好地利用緩存并實現更低的平均內存訪問時間。然而,如果對內存區域的請求并不頻繁,那么考慮基于通過連續線性地址訪問非連續頁幀的分配方案是有意義的。該模式
    的頭像 發表于 02-23 09:44 ?1090次閱讀
    Linux內核<b class='flag-5'>內存</b>管理之內核非連續物理<b class='flag-5'>內存</b><b class='flag-5'>分配</b>

    Linux內核內存管理之ZONE內存分配

    內核中使用ZONE分配器滿足內存分配請求。該分配器必須具有足夠的空閑頁幀,以便滿足各種內存大小請求。
    的頭像 發表于 02-21 09:29 ?961次閱讀
    主站蜘蛛池模板: 91久久国产青草亚洲 | 国产2021成人精品 | 四虎影音在线观看 | 国语自产自拍秒拍在线视频 | 天堂一区二区三区在线观看 | 六月婷婷七月丁香 | 男生女生靠逼视频 | 台湾黄色毛片 | 久久精品福利 | 欧美福利二区 | aaaaaa精品视频在线观看 | 97久久天天综合色天天综合色 | 看全黄大片狐狸视频在线观看 | 久久免费视频网站 | 四虎海外在线永久免费看 | 好男人午夜| 在线免费视频网站 | www.夜夜操 | 欧美一级片免费观看 | 奇米色88欧美一区二区 | 91网站免费在线观看 | 国内精品久久久久影 | 成人欧美一区二区三区的电影 | www.天天射 | 成人国产三级精品 | 欧美黑人换爱交换乱理伦片 | xxx日本69hd | 哪个网站可以看av | 亚洲色图22p | 婷婷在线观看香蕉五月天 | 怡红院国产 | 四虎影院2022 | 五月天男人的天堂 | 午夜国产精品免费观看 | 国产高清色视频免费看的网址 | 欧美综合网站 | 老师啊灬啊灬用力啊快224视频 | 午夜欧美福利视频 | 禁漫羞羞a漫入口 | 午夜在线一区 | 欧美一区二区高清 |