99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

堆內(nèi)存和棧內(nèi)存的區(qū)別是什么

汽車電子技術(shù) ? 來(lái)源:程序喵大人 ? 作者:程序喵大人 ? 2023-02-21 13:54 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

大家好,我是程序喵。

這篇文章分享一個(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,而且??臻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)畫

圖片

棧空間的大小是固定的,它有一個(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)畫。

微信截圖_20230105161930.png

所以才會(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è)圖:

圖片

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)文章。

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

  • 當(dāng)定義一個(gè)vector a(100); a在哪塊內(nèi)存?那100a的空間又在哪里?
  • 當(dāng)定義一個(gè)array a; a在哪塊內(nèi)存,那100個(gè)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/

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4522

    瀏覽量

    87296
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    508

    瀏覽量

    20151
  • 棧空間
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    堆棧內(nèi)存內(nèi)存之間的區(qū)別

    編寫有效的代碼需要了解堆棧和內(nèi)存,這使其成為學(xué)習(xí)編程的重要組成部分。不僅如此,新程序員或職場(chǎng)老手都應(yīng)該完全熟悉堆棧內(nèi)存內(nèi)存之間的
    發(fā)表于 08-07 12:23 ?918次閱讀
    堆棧<b class='flag-5'>內(nèi)存</b>和<b class='flag-5'>堆</b><b class='flag-5'>內(nèi)存</b>之間的<b class='flag-5'>區(qū)別</b>

    【原創(chuàng)】C語(yǔ)言中的動(dòng)態(tài)內(nèi)存-----內(nèi)存

    作者:蔡琰老師(張飛實(shí)戰(zhàn)電子高級(jí)工程師)C語(yǔ)言程序的動(dòng)態(tài)內(nèi)存分為內(nèi)存區(qū)域和內(nèi)存區(qū)域兩種。
    發(fā)表于 07-07 14:18

    【原創(chuàng)】內(nèi)存的那些事

    地址向高地址分配。在C語(yǔ)言中,內(nèi)存在分配和釋放的時(shí)候,是程序通過(guò)調(diào)用C語(yǔ)言的庫(kù)函數(shù)完成的。這和內(nèi)存的分配有區(qū)別,
    發(fā)表于 07-12 09:48

    C語(yǔ)言單片機(jī)、、堆棧的區(qū)別是什么?

    C語(yǔ)言單片機(jī)、、堆棧的區(qū)別是什么?
    發(fā)表于 10-13 08:09

    STM32中的區(qū)別是什么

    區(qū)別是什么?的空間是如何進(jìn)行分配的?
    發(fā)表于 11-29 07:05

    區(qū)別是什么

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

    明確區(qū)分,究竟有什么區(qū)別?

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

    C語(yǔ)言內(nèi)存的筆記資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是C語(yǔ)言內(nèi)存的筆記資料說(shuō)明說(shuō)明了C語(yǔ)言中區(qū)別,哪些數(shù)據(jù)存
    發(fā)表于 02-14 08:00 ?3次下載
    C語(yǔ)言<b class='flag-5'>內(nèi)存</b><b class='flag-5'>堆</b>與<b class='flag-5'>棧</b>的筆記資料說(shuō)明

    C語(yǔ)言程序的動(dòng)態(tài)內(nèi)存內(nèi)存區(qū)域的概念

    C語(yǔ)言程序的動(dòng)態(tài)內(nèi)存分為內(nèi)存區(qū)域和內(nèi)存區(qū)域兩種。內(nèi)存
    的頭像 發(fā)表于 06-29 10:34 ?2011次閱讀

    什么是內(nèi)存?內(nèi)存是如何分配的?

    在一般的編譯系統(tǒng)中,內(nèi)存的分配方向和內(nèi)存是相反的。當(dāng)內(nèi)存從高地址向低地址增長(zhǎng)的時(shí)候,
    的頭像 發(fā)表于 07-05 17:58 ?1w次閱讀

    嵌入式C語(yǔ)言中區(qū)別

    在嵌入式C語(yǔ)言中,都是用來(lái)存儲(chǔ)變量的內(nèi)存區(qū)域,但它們?cè)诖鎯?chǔ)和使用變量方面有很大的區(qū)別。
    的頭像 發(fā)表于 04-14 11:45 ?1830次閱讀

    什么是內(nèi)存?存儲(chǔ)方式是什么樣的?

    只有在內(nèi)存里面才會(huì)發(fā)生內(nèi)存泄漏的問(wèn)題,在內(nèi)存中不會(huì)發(fā)生內(nèi)存泄漏。因?yàn)?/div>
    的頭像 發(fā)表于 06-22 10:29 ?1457次閱讀
    什么是<b class='flag-5'>堆</b><b class='flag-5'>內(nèi)存</b>?存儲(chǔ)方式是什么樣的?

    程序內(nèi)存分區(qū)中的

    (Heap)與(Stack)是開(kāi)發(fā)人員必須面對(duì)的兩個(gè)概念,在理解這兩個(gè)概念時(shí),需要放到具體的場(chǎng)景下,因?yàn)椴煌瑘?chǎng)景下,代表不同的含義。一般情況下,有兩層含義: (1)程序
    的頭像 發(fā)表于 11-11 16:21 ?1171次閱讀
    程序<b class='flag-5'>內(nèi)存</b>分區(qū)中的<b class='flag-5'>堆</b>與<b class='flag-5'>棧</b>

    區(qū)別和使用注意事項(xiàng)

    是在計(jì)算機(jī)科學(xué)中廣泛使用的兩種數(shù)據(jù)結(jié)構(gòu),它們具有不同的用途和特點(diǎn)。區(qū)別涉及到內(nèi)存
    的頭像 發(fā)表于 01-18 17:24 ?2860次閱讀

    C語(yǔ)言內(nèi)存泄漏問(wèn)題原理

    內(nèi)存泄漏問(wèn)題只有在使用內(nèi)存的時(shí)候才會(huì)出現(xiàn),內(nèi)存不存在內(nèi)存泄漏問(wèn)題,因?yàn)?/div>
    發(fā)表于 03-19 11:38 ?817次閱讀
    C語(yǔ)言<b class='flag-5'>內(nèi)存</b>泄漏問(wèn)題原理