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

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

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

3天內不再提示

一文看懂堆和棧的區別和聯系

姚小熊27 ? 來源:網絡整理 ? 2018-04-11 09:50 ? 次閱讀

堆和棧概要

在計算機領域,堆棧是一個不容忽視的概念,堆棧是兩種數據結構。堆棧都是一種數據項按序排列的數據結構,只能在一端(稱為棧頂(top))對數據項進行插入和刪除。在單片機應用中,堆棧是個特殊的存儲區,主要功能是暫時存放數據和地址,通常用來保護斷點和現場。

堆和棧的要點

堆,隊列優先,先進先出(FIFO—firstinfirstout)。

棧,先進后出(FILO—First-In/Last-Out)。

一般情況下,如果有人把堆棧合起來說,那它的意思是棧,可不是堆。

一文看懂堆和棧的區別和聯系

堆和棧的對比分析

1、堆棧空間分配

棧(操作系統):由操作系統自動分配釋放,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。

堆(操作系統):一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似于鏈表

2、堆棧緩存方式

棧使用的是一級緩存,他們通常都是被調用時處于存儲空間中,調用完畢立即釋放。

堆則是存放在二級緩存中,生命周期由虛擬機的垃圾回收算法來決定(并不是一旦成為孤兒對象就能被回收)。所以調用這些對象的速度要相對來得低一些。

3、堆棧數據結構區別

堆(數據結構):堆可以被看成是一棵樹,如:堆排序。

棧(數據結構):一種先進后出的數據結構。

一文看懂堆和棧的區別和聯系

堆和棧的聯系

主函數先進棧,在棧中定義一個變量arr,接下來為arr賦值,但是右邊不是一個具體值,是一個實體。實體創建在堆里,在堆里首先通過new關鍵字開辟一個空間,內存在存儲數據的時候都是通過地址來體現的,地址是一塊連續的二進制,然后給這個實體分配一個內存地址。數組都是有一個索引,數組這個實體在堆內存中產生之后每一個空間都會進行默認的初始化(這是堆內存的特點,未初始化的數據是不能用的,但在堆里是可以用的,因為初始化過了,但是在棧里沒有),不同的類型初始化的值不一樣。所以堆和棧里就創建了變量和實體:

一文看懂堆和棧的區別和聯系

給堆分配了一個地址,把堆的地址賦給arr,arr就通過地址指向了數組。所以arr想操縱數組時,就通過地址,而不是直接把實體都賦給它。這種我們不再叫他基本數據類型,而叫引用數據類型。稱為arr引用了堆內存當中的實體。(可以理解為c或c++的指針,Java成長自c++和c++很像,優化了c++)

如果當int[]arr=null;

arr不做任何指向,null的作用就是取消引用數據類型的指向。

當一個實體,沒有引用數據類型指向的時候,它在堆內存中不會被釋放,而被當做一個垃圾,在不定時的時間內自動回收,因為Java有一個自動回收機制,(而c++沒有,需要程序員手動回收,如果不回收就越堆越多,直到撐滿內存溢出,所以Java在內存管理上優于c++)。自動回收機制(程序)自動監測堆里是否有垃圾,如果有,就會自動的做垃圾回收的動作,但是什么時候收不一定。

所以堆與棧的區別很明顯:

1.棧內存存儲的是局部變量而堆內存存儲的是實體;

2.棧內存的更新速度要快于堆內存,因為局部變量的生命周期很短;

3.棧內存存放的變量生命周期一旦結束就會被釋放,而堆內存存放的實體會被垃圾回收機制不定時的回收。

堆與棧的主要區別

1、管理方式:對于棧來講,是由編譯器自動管理,無需我們手工控制;對于堆來說,釋放工作由程序員控制,容易產生memoryleak。

2、空間大小:一般來講在32位系統下,堆內存可以達到4G的空間,從這個角度來看堆內存幾乎是沒有什么限制的。但是對于棧來講,一般都是有一定的空間大小的,例如,在VC6下面,默認的棧空間大小是1M(好像是,記不清楚了)。當然,我們可以修改:

3、打開工程,依次操作菜單如下:Project-》Setting-》Link,在Category中選中Output,然后在Reserve中設定堆棧的最大值和commit。

注意:reserve最小值為4Byte;commit是保留在虛擬內存的頁文件里面,它設置的較大會使棧開辟較大的值,可能增加內存的開銷和啟動時間。

4、碎片問題:對于堆來講,頻繁的new/delete勢必會造成內存空間的不連續,從而造成大量的碎片,使程序效率降低。對于棧來講,則不會存在這個問題,因為棧是先進后出的隊列,他們是如此的一一對應,以至于永遠都不可能有一個內存塊從棧中間彈出,在他彈出之前,在他上面的后進的棧內容已經被彈出,詳細的可以參考數據結構,這里我們就不再一一討論了。

5、生長方向:對于堆來講,生長方向是向上的,也就是向著內存地址增加的方向;對于棧來講,它的生長方向是向下的,是向著內存地址減小的方向增長。

6、分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如局部變量的分配。動態分配由alloca函數進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。

7、分配效率:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,它的機制是很復雜的,例如為了分配一塊內存,庫函數會按照一定的算法(具體的算法可以參考數據結構/操作系統)在堆內存中搜索可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由于內存碎片太多),就有可能調用系統功能去增加程序數據段的內存空間,這樣就有機會分到足夠大小的內存,然后進行返回。顯然,堆的效率比棧要低得多。

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

    評論

    相關推薦

    區別在哪

    以下引用網上資料 理解區別(1)區(stack):由編譯器自動分配和釋放,存放函數的參數值、局部變量的值等,其操作方式類似于數據結構中的
    發表于 08-11 09:18

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

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

    單片機中有什么區別

    M0中的空間的區別:(1)區(st
    發表于 11-22 06:23

    STM32中的區別是什么

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

    區別是什么

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

    什么是?什么是

    在嵌入式編程中,個很重要的概念,不管是裸機編程還是基于RTOS編程。函數形參、局部變量、函數調用現場的保護及返回地址、中斷函數執行前線程保護及中斷嵌套的現場的保護都依賴于空間。
    發表于 12-22 06:09

    單片機區別在哪

    文末有圖和程序幫助理解!!!區別可以用如下的比喻來看出:使用就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走不必理會切菜、洗菜等準備工作和洗碗、刷鍋
    發表于 01-20 08:31

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

    這條短短的句話就包含了,看到new,我們首先就應該想到,我們分配了內存,那么指針p呢?他分配的是
    的頭像 發表于 04-09 09:45 ?4428次閱讀
    明確區分<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>?

    如何分清區別(7大關鍵點)

    區別直都是永恒的話題,為此我也查了很多的資料,以防自己的理解錯誤,而給他人造成理解偏差。
    發表于 12-24 10:47 ?1.1w次閱讀

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

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

    理解區別(STM32)資料下載

    電子發燒友網為你提供理解區別(STM32)資料下載的電子資料下載,更有其他相關的電路圖、源代碼、課件教程、中文資料、英文資料、參考設計、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發表于 03-31 08:44 ?14次下載
    理解<b class='flag-5'>堆</b>和<b class='flag-5'>棧</b>的<b class='flag-5'>區別</b>(STM32)資料下載

    單片機中區別

    M0中的空間的區別:(1)區(st
    發表于 11-13 14:51 ?9次下載
    單片機中<b class='flag-5'>堆</b>和<b class='flag-5'>棧</b>的<b class='flag-5'>區別</b>

    的增長方向為什么通常是相反的?

    數據結構中,(heap)與(stack)是兩個常見的數據結構,它們的存在都是為了優化內存,提高使用效率,各有特點,理解二者的定義、用法與區別,能夠利用
    的頭像 發表于 02-15 15:08 ?8910次閱讀
    <b class='flag-5'>堆</b>和<b class='flag-5'>棧</b>的增長方向為什么通常是相反的?

    嵌入式C語言中區別

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

    區別和使用注意事項

    是在計算機科學中廣泛使用的兩種數據結構,它們具有不同的用途和特點。區別涉及到內存分配、訪問方式、數據存儲等方面。在使用
    的頭像 發表于 01-18 17:24 ?2222次閱讀
    主站蜘蛛池模板: 久久青青草原精品老司机| 国产免费成人在线视频| 国产精品你懂得| 免费一级毛片正在播放| 亚洲视频在线免费看| 四虎三级| 99久久综合狠狠综合久久男同| 久久精品隔壁老王影院| 国产成人综合日韩精品婷婷九月| 日本黄色站| 亚洲丁香网| 又粗又大撑满了好爽| 美女鲜嫩bbbb| 狠狠一区| 加勒比综合| 国产成人午夜片在线观看| xxxx人成高清免费图片| 色偷偷成人| 午夜大片男女免费观看爽爽爽尤物| 38pao强力打造永久免费高清视频| 色盈盈| 亚洲久久在线| 欧美亚洲视频一区| 噜啪啪| 小屁孩cao大人免费网站| 亚洲视频在线网| 麻豆国产一区二区在线观看| 欧美图片小说视频| 一卡二卡三卡四卡无卡在线| 国产高清美女一级a毛片| 性欧美一区| 日本电影在线观看黄| 色片视频网站| 一级毛片无毒不卡直接观看| 成人精品在线观看| 亚洲国产一区二区在线| 十三以下岁女子毛片免费播放| 午夜免费剧场| 在线观看色视频| 欧美一区二区三区视频| 特污兔午夜影院|