在线不卡日本ⅴ一区v二区_精品一区二区中文字幕_天堂v在线视频_亚洲五月天婷婷中文网站

  • <menu id="lky3g"></menu>
  • <style id="lky3g"></style>
    <pre id="lky3g"><tt id="lky3g"></tt></pre>

    還有多少人搞不懂堆內(nèi)存和棧內(nèi)存的區(qū)別?

    還有多少人搞不懂堆內(nèi)存和棧內(nèi)存的區(qū)別?

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

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


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

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

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

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

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

    可以看這兩個動畫

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

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


    那堆內(nèi)存呢?

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

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

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

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

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

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

    相關(guān)視頻推薦

    90分鐘了解Linux內(nèi)存架構(gòu),numa的優(yōu)勢,slab的實現(xiàn),vmalloc的原理

    linux內(nèi)存管理-龐雜的內(nèi)存問題,如何理出自己的思路出來

    學(xué)習(xí)地址:C/C++Linux服務(wù)器開發(fā)/后臺架構(gòu)師【零聲教育】-學(xué)習(xí)視頻教程-騰訊課堂

    需要C/C++ Linux服務(wù)器架構(gòu)師學(xué)習(xí)資料加qun812855908獲?。ㄙY料包括C/C++,Linux,golang技術(shù),Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協(xié)程,DPDK,ffmpeg等),免費分享


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

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


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

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

    速度

    空間管理

    高效,不會產(chǎn)生碎片

    會產(chǎn)生內(nèi)存碎片

    訪問權(quán)限

    只能局部變量

    可以訪問全局變量

    空間大小限制

    操作系統(tǒng)限制

    沒有特定的限制

    內(nèi)存分配

    連續(xù)

    隨機分配

    分配和釋放

    編譯器指令自動管理

    程序員手動管理

    開銷

    主要問題

    空間小

    內(nèi)存碎片

    靈活性

    固定大小

    可以resize

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

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

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

    最后是提問環(huán)節(jié),大家可以在評論區(qū)討論一下哈。

    • 當(dāng)定義一個vector a(100); a在哪塊內(nèi)存?那100a的空間又在哪里?
    • 當(dāng)定義一個array a; a在哪塊內(nèi)存,那100個a的空間又在哪里?
    鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權(quán)歸原作者所有,如有侵權(quán)請聯(lián)系管理員(admin#wlmqw.com)刪除。
    上一篇 2022年6月16日 18:02
    下一篇 2022年6月16日 18:02

    相關(guān)推薦

    聯(lián)系我們

    聯(lián)系郵箱:admin#wlmqw.com
    工作時間:周一至周五,10:30-18:30,節(jié)假日休息