女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

堆內存和棧內存的區別是什么

汽車電子技術 ? 來源:程序喵大人 ? 作者:程序喵大人 ? 2023-02-21 13:54 ? 次閱讀

大家好,我是程序喵。

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

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


先介紹下棧內存:

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

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

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

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

可以看這兩個動畫

圖片

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

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


那堆內存呢?

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

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

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

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

微信截圖_20230105161930.png

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

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


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

圖片

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


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

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

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

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

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

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

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

最后是 提問環節 ,大家可以在評論區討論一下哈。

  • 當定義一個vector a(100); a在哪塊內存?那100a的空間又在哪里?
  • 當定義一個array a; a在哪塊內存,那100個a的空間又在哪里?

參考鏈接

https://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap

https://www.guru99.com/stack-vs-heap.html

https://www.geeksforgeeks.org/stack-vs-heap-memory-allocation/

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

    關注

    13

    文章

    4492

    瀏覽量

    86993
  • 線程
    +關注

    關注

    0

    文章

    507

    瀏覽量

    20062
  • 棧空間
    +關注

    關注

    0

    文章

    5

    瀏覽量

    5502
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    堆棧內存內存之間的區別

    編寫有效的代碼需要了解堆棧和內存,這使其成為學習編程的重要組成部分。不僅如此,新程序員或職場老手都應該完全熟悉堆棧內存內存之間的
    發表于 08-07 12:23 ?876次閱讀
    堆棧<b class='flag-5'>內存</b>和<b class='flag-5'>堆</b><b class='flag-5'>內存</b>之間的<b class='flag-5'>區別</b>

    【原創】C語言中的動態內存-----內存

    作者:蔡琰老師(張飛實戰電子高級工程師)C語言程序的動態內存分為內存區域和內存區域兩種。
    發表于 07-07 14:18

    【原創】內存的那些事

    地址向高地址分配。在C語言中,內存在分配和釋放的時候,是程序通過調用C語言的庫函數完成的。這和內存的分配有區別
    發表于 07-12 09:48

    C語言單片機、堆棧的區別是什么?

    C語言單片機、堆棧的區別是什么?
    發表于 10-13 08:09

    STM32中的區別是什么

    區別是什么?的空間是如何進行分配的?
    發表于 11-29 07:05

    區別是什么

    在回答完進程的虛擬地址空間布局之后(上一篇),面試官可能抓住深入展開。區別①管理方式:
    發表于 12-22 07:26

    明確區分,究竟有什么區別?

    這條短短的一句話就包含了,看到new,我們首先就應該想到,我們分配了一塊內存,那么指針p呢?他分配的是一塊
    的頭像 發表于 04-09 09:45 ?4643次閱讀
    明確區分<b class='flag-5'>堆</b>與<b class='flag-5'>棧</b>,<b class='flag-5'>堆</b>和<b class='flag-5'>棧</b>究竟有什么<b class='flag-5'>區別</b>?

    C語言內存的筆記資料說明

    本文檔的主要內容詳細介紹的是C語言內存的筆記資料說明說明了C語言中區別,哪些數據存
    發表于 02-14 08:00 ?3次下載
    C語言<b class='flag-5'>內存</b><b class='flag-5'>堆</b>與<b class='flag-5'>棧</b>的筆記資料說明

    C語言程序的動態內存內存區域的概念

    C語言程序的動態內存分為內存區域和內存區域兩種。內存
    的頭像 發表于 06-29 10:34 ?1963次閱讀

    什么是內存內存是如何分配的?

    在一般的編譯系統中,內存的分配方向和內存是相反的。當內存從高地址向低地址增長的時候,
    的頭像 發表于 07-05 17:58 ?1w次閱讀

    嵌入式C語言中區別

    在嵌入式C語言中,都是用來存儲變量的內存區域,但它們在存儲和使用變量方面有很大的區別
    的頭像 發表于 04-14 11:45 ?1729次閱讀

    什么是內存?存儲方式是什么樣的?

    只有在內存里面才會發生內存泄漏的問題,在內存中不會發生內存泄漏。因為
    的頭像 發表于 06-22 10:29 ?1388次閱讀
    什么是<b class='flag-5'>堆</b><b class='flag-5'>內存</b>?存儲方式是什么樣的?

    程序內存分區中的

    (Heap)與(Stack)是開發人員必須面對的兩個概念,在理解這兩個概念時,需要放到具體的場景下,因為不同場景下,代表不同的含義。一般情況下,有兩層含義: (1)程序
    的頭像 發表于 11-11 16:21 ?1055次閱讀
    程序<b class='flag-5'>內存</b>分區中的<b class='flag-5'>堆</b>與<b class='flag-5'>棧</b>

    區別和使用注意事項

    是在計算機科學中廣泛使用的兩種數據結構,它們具有不同的用途和特點。區別涉及到內存
    的頭像 發表于 01-18 17:24 ?2725次閱讀

    C語言內存泄漏問題原理

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