色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

關于堆棧的深入理解

0BFC_eet_china ? 來源:未知 ? 作者:鄧佳佳 ? 2018-03-04 15:57 ? 次閱讀

一、這些個概念怎么來的以及怎么記得住

這里,只限于整理我個人對堆/棧/堆棧在內存管理方面的理解。其他,在數據結構方面講的堆/棧目前不在我整理范圍之內。

這里提了三個概念: 堆,棧,以及堆棧。我把棧和堆棧的概念等同了。所以,接下來只要把兩個概念弄清楚就可以了:堆和棧。

先說由來。由于我的工作大部分是和單片機相關的,因此也是基于嵌入式的這個方面的理解。

每片MCU有一定的內存,這些內存分:程序存儲區;數據存儲區。舉例就是:我們寫的每行代碼,都會保存到程序存儲區里面;而定義的一些全局變量,靜態變量,局部變量之類的,就保存到數據存儲區。

程序存儲區,對于寫代碼的人來說,可以說是黑盒子:只要你的代碼不超過程序代碼空間,everything will be fine. 代碼究竟是如何執行的,取決于你的編程思想,就是說,你讓程序往東走,它就會往東走;讓它原地踏步,它也會照做;前提是你的代碼要寫好。所以,對于編程經 驗成熟的人,同樣的算法,他可能會少敲幾行代碼,并且算法出錯的幾率少一些;不怎么會編程的人,就多敲幾行,多測試一下。研究深一些的人,可能還會對代碼 執行效率深入研究。我決定就此止步。繼續黑盒子的話題程序員的代碼會燒寫到程序存儲區里面,至于哪條語句存哪里,這個是不用研究的。反正,一旦發現軟件 沒按照你設計的那樣跑,基本就是程序自身的問題,不是存放程序的存儲區的問題。

數據存儲區,讓程序員發揮的空間就很大了。由于程序是動態地執行的,執行的結果是怎么樣,會產生什么數據就不是一個確定的事情。

舉個例子說說這個程序和數據之間的表象吧。舉例的事件就是:一個MP3播放器的上/下鍵的操作。加入在播放器里有10首歌,若當前是第3首,那 么按下[上]鍵后,應該是播放第2首。因此,實現播放第2首的,就是程序員寫程序實現的,他的代碼讓[上]鍵實現了能從第3首切換到第2首的操作。這里, 表現的就是代碼。而且,這個代碼是確切的行為,從第3首按了[上]鍵之后,一定是播放到第2首。這個是確切的行為,如果不能實現,就是代碼有bug了,需 要改正。終于可以扯到數據了。第2首是什么歌呢? 就是說第2首歌的內容是什么呢? 當然在程序員寫代碼的時候,他是不知道的,他要做的,就是預先開一片數據空間,以存放歌曲相關的數據。這片數據空間,想放什么就放什么,是靈活的。聽煩了 這幾首歌以后,再更換其它音頻文件就是了。再說具體一點,程序就相當于修的一條路,讓車可以在上面跑;但車上面裝了什么,程序員是不知道的。

堆和棧屬于數據存儲區的范疇,也可以算是數據管理的手段或方法。基于此,不能一概而論,說哪個手段高明一些;他們也是基于現實的需要而產生的。黑格爾說:存在就是合理的。

這樣的概念大家都不陌生:軍隊的管理是很嚴格的,很死板的;但是對于一些年輕的技術公司來說,員工就享有很高的自由度。

如果我說,墻角邊整齊地擺放著10本書; 以及墻角邊的書凌亂地放著。你閉上眼睛,能區分出兩種畫面嗎? 如果沒有,就不用往下看了。

棧的特性,就是嚴格/有序/規范的。棧的英文就是Stack. 如果我說,there are books stacked in that corner,你應該能知道書是怎么放的吧。

相反,堆呢,就是自由/靈活/隨意的。堆的英文是Heap. 如果我說,there are books heaped in that corner,你應該能知道書是怎么放的吧。

二、get closer to the real STACK/HEAP。

棧: 由系統自動分配和回收的。

堆: 由程序員分配和回收的。

基于第一部分的理解,不用想都知道,作為“堆”的數據空間,也必須是靈活的,因為成千上萬的程序員在寫什么程序是未知的。但可知道的一點,就是他們是跑在確定的某個OS里面的。

因此,也不過就是給系統管理的數據空間起了個名字,就棧;給程序員使用的空間,起了個名,就堆。

我接下來就會廢話:起什么名字都不重要,重要的是,我們得對這兩種數據存儲區的管理的機制由來,方法有深刻認識;這樣,即便幾個世紀以后它們更名為阿貓阿狗了,我們依然能認知它們。

舉例:

void Check_Pro_Code( uint8 style )

{

uint8 i;

switch( style )

{

......

}

}

void main( )

{

uint8 j = 1;

Check_Pro_Code( j );

}

在main()函數里調用了Check_Pro_Code(...)函數,事先要對j進行入棧操作;當然這里函數調用的時候,涉及到幾個入棧操作:程序的下一個執行地址;局部變量;形參。

這里,我就沒有深入介紹了。

實在很慚愧的是,我寫的嵌入式軟件里,沒有涉及到任何和堆操作相關的。我就是那樣一個人,CM3內核里也沒有移植操作系統,實在是汗顏,因為本人對RTOS實在是未曾涉獵。所以,我這里對于堆的介紹,是沒有任何實戰鷹眼的。并且為了堆我就堆了一下。你說,這樣算學術造假嗎?

void main( )

{

int j=10;

int *p;

p = malloc( 10 ); //話說這里就是堆,我是為了用而用,實在是無味地很。

p = "123456".

}

三、話說堆棧溢出

再次明確,堆棧溢出的堆棧是指棧。

1 當C程序函數的調用層次過深或者出現了遞歸調用,就容易使程序運行所需的堆棧空間超過系統能提供的最大堆棧空間范圍,產生堆棧溢出。

這是很明白的,當A函數調用了B函數,而B()里面又調用了C(),C()里又調用了D()......當這樣的調用太深的時候,就容易堆棧溢出了。

四、一級緩存/二級緩存

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

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

棧的優勢是,存取速度比堆要快,僅次于直接位于CPU中的寄存器

舉個我知道的例子:

void main( )

{

int i,j;

static int flag = 1;

i = Sum_Of_Group( );

j = Check_Exist( );

}

這里,i,j的值都是給通用寄存器的,而不是給予確切的物理地址。而對于flag,由于其為靜態變量,是在SRAM里面分配地址的。這里好像沒有說到一級緩存二級緩存。時間限制,下回述。

五、棧:在Windows下,棧是向低地址擴展的數據 結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩余空間時,將提示overflow。因 此,能從棧獲得的空間較小。

堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由于系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。

注:該段內容100%抄襲,出處:網絡

六、如何修改我自己的工程的STACK(以下內容不通用)

由于我自己的工程用的是LPC1765,剛好從網絡抄到了比較有用的圖片。摘于此。其他單片機的編譯環境,應該也是差不多如法炮制的。

編譯環境: IAR for ARM.

圖一 :如何修改STACK的大小

圖二,如何知道自己的工程用了多少堆棧

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

    關注

    0

    文章

    182

    瀏覽量

    19789

原文標題:關于堆棧的深入理解

文章出處:【微信號:eet-china,微信公眾號:電子工程專輯】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    深入理解C語言:循環語句的應用與優化技巧

    能讓你的代碼更加簡潔明了,還能顯著提升程序執行效率。本文將詳細介紹C語言中的三種常見循環結構——while循環、for循環和do...while循環,帶你深入理解
    的頭像 發表于 12-07 01:11 ?193次閱讀
    <b class='flag-5'>深入理解</b>C語言:循環語句的應用與優化技巧

    深入理解 Llama 3 的架構設計

    最新的自然語言處理(NLP)技術和深度學習算法,旨在提供更加自然、流暢和智能的對話體驗。 1. 核心組件 Llama 3的架構設計可以分為以下幾個核心組件: 1.1 預處理模塊 預處理模塊負責將原始文本數據轉換為模型可以理解的格式。這包括文本清洗
    的頭像 發表于 10-27 14:41 ?576次閱讀

    深入理解FPD-link III ADAS解串器HUB產品

    電子發燒友網站提供《深入理解FPD-link III ADAS解串器HUB產品.pdf》資料免費下載
    發表于 09-06 09:58 ?1次下載
    <b class='flag-5'>深入理解</b>FPD-link III ADAS解串器HUB產品

    堆棧和內存的基本知識

    本文主要聊聊關于堆棧的內容。包括堆棧和內存的基本知識。常見和堆棧相關的 bug,如棧溢出,內存泄漏,堆內存分配失敗等。后面介紹軟件中堆棧統計
    的頭像 發表于 08-29 14:10 ?493次閱讀
    <b class='flag-5'>堆棧</b>和內存的基本知識

    錫焊原理解析:深入理解電子產品制造的核心工藝

    探索焊接技術在精密電子工程中的重要性和創新,從基礎元件的連接到現代焊接技術的進展,深入了解焊接材料的選擇與焊接技術的分類。本文提供了對錫焊原理的深入分析,揭示了高質量電子產品制造的關鍵因素。
    的頭像 發表于 08-12 15:03 ?754次閱讀
    錫焊原<b class='flag-5'>理解</b>析:<b class='flag-5'>深入理解</b>電子產品制造的核心工藝

    技術干貨驛站 ▏深入理解C語言:基本數據類型和變量

    在C語言中,數據類型和變量是編程的基礎,也是理解更復雜概念的關鍵。數據類型決定了變量的內存分配、存儲范圍和操作方式,而變量則是存儲數據的容器。本篇文章將從基本數據類型和變量兩個方面,帶你深入了解C
    的頭像 發表于 07-26 17:53 ?2190次閱讀
    技術干貨驛站 ▏<b class='flag-5'>深入理解</b>C語言:基本數據類型和變量

    深入理解渲染引擎:打造逼真圖像的關鍵

    在數字世界中,圖像渲染是創造逼真視覺效果的核心技術。渲染引擎,作為這一過程中的關鍵組件,負責將二維或三維的模型、紋理、光照等數據轉化為人們肉眼可見的二維圖像。本文將深入探討渲染引擎的工作原理及其在打
    的頭像 發表于 06-29 08:28 ?341次閱讀
    <b class='flag-5'>深入理解</b>渲染引擎:打造逼真圖像的關鍵

    深入理解FFmpeg閱讀體驗》

    一、編譯X264 H.264是ITU(International Telecommunication Union,國際通信聯盟)和MPEG(Motion Picture Experts Group,運動圖像專家組)聯合制定的視頻編碼標準。而X264是一個開源的H.264/MPEG-4 AVC視頻編碼函數庫,是最好的有損視頻編碼器之一。 先直接從網絡(http://download.videolan.org/pub/videolan/x264/snapshots/)獲取X264源碼。考慮到版本關系,本文我下載的是x264-snapshot-20180430-2245-stable.tar.bz2。 tar -vxf x264-snapshot-20180430-2245-stable.tar.bz2 mkdir x264 手動創建的X264文件夾用于存放編譯后的X264庫。執行如下命令: ./configure --host=aarch64-linux --prefix=/home/x264 --enable-shared --disable-asm --enable-static --cross-prefix=aarch64-linux-gnu- 之后執行make make install完成x264庫的交叉編譯。生成的文件信息如下: root@EliteDesk800:~/x264/lib$ ls libx264.solibx264.so.152pkgconfig root@EliteDesk800:~/x264/lib$ file * libx264.so:symbolic link to libx264.so.152 libx264.so.152: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=01dd733d65c98eb894b4cdd41216259543ec8405, with debug_info, not stripped pkgconfig:directory 二、編譯FFmpeg 首先從FFmpeg官方網站http://ffmpeg.org/download.html上下載FFmpeg源碼。 tar -vxf ffmpeg-snapshot.tar.bz2 mkdir ffmpeg_install 其中ffmpeg_install文件夾用于保存生成的文件。執行如下命令: ./configure --prefix=/home/ffmpeg_install --enable-cross-compile --arch=arm64 --target-os=linux --cc=aarch64-linux-gnu-gcc --disable-x86asm --cross-prefix=aarch64-linugnu---pkg-config=/usr/bin/pkg-config --pkg-config=/usr/bin/pkg-config主要用于解決ERROR: x264 not found using pkg-config問題,網上很多解決方法都不靠譜。 之后執行make make install完成ffmpeg的交叉編譯。 生成的文件信息如下: root@EliteDesk800:~/ffmpeg$ file ../ffmpeg_install/bin/* ../ffmpeg_install/bin/ffmpeg:ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=b32285f11866f79dd499330849a9b3195ea0e446, stripped ../ffmpeg_install/bin/ffprobe: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=5d3fa4ea21ad6c4395bbaf134b915190799305b2, stripped
    發表于 04-16 22:54

    深入理解 Sora 的技術原理

    將去除噪音后的結果數據,利用視頻解碼器進行解碼,將低維潛在空間數據還原成原始視頻數據,這里可以實現不同分辨率的視頻解碼。
    的頭像 發表于 04-05 09:19 ?1974次閱讀
    <b class='flag-5'>深入理解</b> Sora 的技術原理

    深入理解 FPGA 的基礎結構

    轉載地址:https://zhuanlan.zhihu.com/p/506828648 文章很詳細的介紹了FPGA的基礎結構,能更直觀的理解內部結構原理。對深入學習很有幫助。 以下是正文: 這一段
    發表于 04-03 17:39

    深入理解數據備份的關鍵原則:應用一致性與崩潰一致性的區別

    深入理解數據備份的關鍵原則:應用一致性與崩潰一致性的區別 在數字化時代,數據備份成為了企業信息安全的核心環節。但在備份過程中,兩個關鍵概念——應用一致性和崩潰一致性,常常被誤解或混淆。本文旨在闡明
    的頭像 發表于 03-11 11:29 ?956次閱讀
    <b class='flag-5'>深入理解</b>數據備份的關鍵原則:應用一致性與崩潰一致性的區別

    深入理解GPIO原理和運用

    GPIO允許我們的單片機與外部世界進行通信,它是我們控制外部設備和接收外部信號的接口。
    的頭像 發表于 02-19 16:12 ?1936次閱讀
    <b class='flag-5'>深入理解</b>GPIO原理和運用

    恒訊科技帶大家深入理解:WebSocket服務器的工作原理

    WebSocket是一種在單個TCP連接上進行全雙工通信的通信協議。它的設計目標是在Web瀏覽器和服務器之間提供低延遲、高效的雙向通信。下面是深入理解WebSocket服務器工作原理的一些關鍵概念
    的頭像 發表于 01-29 16:48 ?496次閱讀

    深入理解FFmpeg閱讀體驗》ffmpeg安裝

    書中講了如何編譯安裝,我看了一下比較復雜,所以下載安裝包進行安裝,下載網址:Download FFmpeg 下載完后解壓出來在bin目錄下面有三個文件: 復制這個目錄: C:\\\\Users\\\\liujianhua\\\\Downloads\\\\ffmpeg-6.1.1-essentials_build\\\\ffmpeg-6.1.1-essentials_build\\\\bin 打開環境變量: 將剛才復制的地址添加進去 到此就安裝結束,測試一下是否安裝成功,打開shell輸入ffmpeg -version就可以看到輸出信息:
    發表于 01-25 21:35

    深入理解光耦模擬隔離放大電路的技術奧秘

    深入理解光耦模擬隔離放大電路的技術奧秘 ?編輯 ▲ 圖1 仿真原理圖二、原理分析 之所以這個電路圖看起來容易讓人感到困惑,實際上就是這個仿真電路中,錯誤的使用了這樣的光電三極管來表示HCNR201
    發表于 01-10 10:12
    主站蜘蛛池模板: 色色色五的天| 国内精品久久久久影院亚洲| 成人中文字幕在线观看| 久久99国产精品二区不卡| 日本不卡三卡四卡| 尹人综合网| 国产精品嫩草影院一区二区三区| 美国色情三级欧美三级纸匠情挑| 午夜福利自怕| 日韩熟女精品一区二区三区 | 综合色就爱涩涩涩综合婷婷 | 艳照门在线观看| 亚洲精品喷白浆在线观看| 亚洲蜜芽在线观看精品一区| 在线视频久久只有精品第一日韩| 在线高清视频不卡无码| 国产精品久久久久一区二区三区| 精品国产mmd在线观看| 大地影院在线播放| 理论937| 亚洲国产精品线在线观看| 成年人视频免费在线播放| 美女扒开尿口让男生添动态图| 亚洲国产精品一区二区久久第| 成人性生交大片| 免费撕开胸罩吮胸视频| 伊人精品久久久大香线蕉99| 国产午夜精品一区二区| 色翁荡息又大又硬又粗又爽电影| 99久久99久久精品国产片果冻| 久久久久久九九| 亚洲精品偷拍影视在线观看| 国产精品久久久久久久久久影院| 日本久久久| 把腿张开再深点好爽宝贝动态图| 美女张开让男生桶| 中文字幕日本在线mv视频精品| 久久99热在线观看7| 杨幂视频1分11未删减在线观看| 国产一级特黄aa毛片| 性888xxxx入欧美|