哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

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

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

關(guān)于堆棧的深入理解

0BFC_eet_china ? 來源:未知 ? 作者:鄧佳佳 ? 2018-03-04 15:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

這里,只限于整理我個(gè)人對(duì)堆/棧/堆棧在內(nèi)存管理方面的理解。其他,在數(shù)據(jù)結(jié)構(gòu)方面講的堆/棧目前不在我整理范圍之內(nèi)。

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

先說由來。由于我的工作大部分是和單片機(jī)相關(guān)的,因此也是基于嵌入式的這個(gè)方面的理解。

每片MCU有一定的內(nèi)存,這些內(nèi)存分:程序存儲(chǔ)區(qū);數(shù)據(jù)存儲(chǔ)區(qū)。舉例就是:我們寫的每行代碼,都會(huì)保存到程序存儲(chǔ)區(qū)里面;而定義的一些全局變量,靜態(tài)變量,局部變量之類的,就保存到數(shù)據(jù)存儲(chǔ)區(qū)。

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

數(shù)據(jù)存儲(chǔ)區(qū),讓程序員發(fā)揮的空間就很大了。由于程序是動(dòng)態(tài)地執(zhí)行的,執(zhí)行的結(jié)果是怎么樣,會(huì)產(chǎn)生什么數(shù)據(jù)就不是一個(gè)確定的事情。

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

堆和棧屬于數(shù)據(jù)存儲(chǔ)區(qū)的范疇,也可以算是數(shù)據(jù)管理的手段或方法?;诖?,不能一概而論,說哪個(gè)手段高明一些;他們也是基于現(xiàn)實(shí)的需要而產(chǎn)生的。黑格爾說:存在就是合理的。

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

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

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

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

二、get closer to the real STACK/HEAP。

棧: 由系統(tǒng)自動(dòng)分配和回收的。

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

基于第一部分的理解,不用想都知道,作為“堆”的數(shù)據(jù)空間,也必須是靈活的,因?yàn)槌汕先f的程序員在寫什么程序是未知的。但可知道的一點(diǎn),就是他們是跑在確定的某個(gè)OS里面的。

因此,也不過就是給系統(tǒng)管理的數(shù)據(jù)空間起了個(gè)名字,就棧;給程序員使用的空間,起了個(gè)名,就堆。

我接下來就會(huì)廢話:起什么名字都不重要,重要的是,我們得對(duì)這兩種數(shù)據(jù)存儲(chǔ)區(qū)的管理的機(jī)制由來,方法有深刻認(rèn)識(shí);這樣,即便幾個(gè)世紀(jì)以后它們更名為阿貓阿狗了,我們依然能認(rèn)知它們。

舉例:

void Check_Pro_Code( uint8 style )

{

uint8 i;

switch( style )

{

......

}

}

void main( )

{

uint8 j = 1;

Check_Pro_Code( j );

}

在main()函數(shù)里調(diào)用了Check_Pro_Code(...)函數(shù),事先要對(duì)j進(jìn)行入棧操作;當(dāng)然這里函數(shù)調(diào)用的時(shí)候,涉及到幾個(gè)入棧操作:程序的下一個(gè)執(zhí)行地址;局部變量;形參。

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

實(shí)在很慚愧的是,我寫的嵌入式軟件里,沒有涉及到任何和堆操作相關(guān)的。我就是那樣一個(gè)人,CM3內(nèi)核里也沒有移植操作系統(tǒng),實(shí)在是汗顏,因?yàn)楸救藢?duì)RTOS實(shí)在是未曾涉獵。所以,我這里對(duì)于堆的介紹,是沒有任何實(shí)戰(zhàn)鷹眼的。并且為了堆我就堆了一下。你說,這樣算學(xué)術(shù)造假嗎?

void main( )

{

int j=10;

int *p;

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

p = "123456".

}

三、話說堆棧溢出

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

1 當(dāng)C程序函數(shù)的調(diào)用層次過深或者出現(xiàn)了遞歸調(diào)用,就容易使程序運(yùn)行所需的堆??臻g超過系統(tǒng)能提供的最大堆??臻g范圍,產(chǎn)生堆棧溢出。

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

四、一級(jí)緩存/二級(jí)緩存

棧使用的是一級(jí)緩存, 他們通常都是被調(diào)用時(shí)處于存儲(chǔ)空間中,調(diào)用完畢立即釋放。

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

棧的優(yōu)勢(shì)是,存取速度比堆要快,僅次于直接位于CPU中的寄存器

舉個(gè)我知道的例子:

void main( )

{

int i,j;

static int flag = 1;

i = Sum_Of_Group( );

j = Check_Exist( );

}

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

五、棧:在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù) 結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個(gè)編譯時(shí)就確定的常數(shù)),如果申請(qǐng)的空間超過棧的剩余空間時(shí),將提示overflow。因 此,能從棧獲得的空間較小。

堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲(chǔ)的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存。由此可見,堆獲得的空間比較靈活,也比較大。

注:該段內(nèi)容100%抄襲,出處:網(wǎng)絡(luò)。

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

由于我自己的工程用的是LPC1765,剛好從網(wǎng)絡(luò)抄到了比較有用的圖片。摘于此。其他單片機(jī)的編譯環(huán)境,應(yīng)該也是差不多如法炮制的。

編譯環(huán)境: IAR for ARM.

圖一 :如何修改STACK的大小

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 堆棧
    +關(guān)注

    關(guān)注

    0

    文章

    184

    瀏覽量

    20576

原文標(biāo)題:關(guān)于堆棧的深入理解

文章出處:【微信號(hào):eet-china,微信公眾號(hào):電子工程專輯】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    怎么理解TCP三次握手和四次揮手

    作為運(yùn)維工程師,無論是排查網(wǎng)絡(luò)故障、分析日志,還是配置負(fù)載均衡器,都需要對(duì) TCP 協(xié)議有深入理解。很多"疑難雜癥"的根源,往往在于對(duì) TCP 狀態(tài)轉(zhuǎn)換和連接管理理解不夠透徹。
    的頭像 發(fā)表于 04-10 16:42 ?802次閱讀

    深入理解積分型ADC

    深入理解積分型ADC 一、引言 作為電子工程師,我們?cè)谠O(shè)計(jì)中常常需要將模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào),而積分型模數(shù)轉(zhuǎn)換器(ADCs)就是實(shí)現(xiàn)這一功能的重要手段之一。積分型ADC能夠提供高分辨率的模數(shù)轉(zhuǎn)換,并
    的頭像 發(fā)表于 04-02 09:15 ?670次閱讀

    如何理解直流無刷電機(jī)倒相的說法?

    直流無刷電機(jī)(BLDC)的“倒相”是電機(jī)控制領(lǐng)域的關(guān)鍵概念,其本質(zhì)是通過電子換相替代傳統(tǒng)有刷電機(jī)的機(jī)械換相,實(shí)現(xiàn)高效、精準(zhǔn)的轉(zhuǎn)矩控制。要深入理解這一說法,需從工作原理、控制邏輯及技術(shù)實(shí)現(xiàn)三個(gè)維度展開分析。
    的頭像 發(fā)表于 03-16 17:31 ?672次閱讀

    怎樣理解和調(diào)試變頻器的轉(zhuǎn)矩提升功能

    變頻器作為現(xiàn)代工業(yè)控制中不可或缺的核心設(shè)備,其轉(zhuǎn)矩提升功能直接關(guān)系到電機(jī)啟動(dòng)性能、負(fù)載適應(yīng)能力以及系統(tǒng)能效優(yōu)化。這一功能的合理設(shè)置,既是工程師調(diào)試經(jīng)驗(yàn)的體現(xiàn),也是實(shí)現(xiàn)設(shè)備高效運(yùn)行的關(guān)鍵技術(shù)環(huán)節(jié)。要深入理解轉(zhuǎn)矩提升的本質(zhì),需從原理出發(fā),結(jié)合應(yīng)用場景,掌握其調(diào)試方法論。
    的頭像 發(fā)表于 02-28 16:57 ?689次閱讀
    怎樣<b class='flag-5'>理解</b>和調(diào)試變頻器的轉(zhuǎn)矩提升功能

    關(guān)于步進(jìn)電機(jī)脈沖和步距角相關(guān)的問題

    步進(jìn)電機(jī)作為一種將電脈沖信號(hào)轉(zhuǎn)換為角位移或線位移的執(zhí)行元件,其核心控制參數(shù)——脈沖與步距角的關(guān)系直接決定了系統(tǒng)的精度與動(dòng)態(tài)性能。要深入理解這一機(jī)制,需從步進(jìn)電機(jī)的工作原理、脈沖驅(qū)動(dòng)特性、步距角內(nèi)涵以及實(shí)際應(yīng)用中的關(guān)鍵考量展開分析。
    的頭像 發(fā)表于 02-27 16:49 ?592次閱讀
    <b class='flag-5'>關(guān)于</b>步進(jìn)電機(jī)脈沖和步距角相關(guān)的問題

    深入剖析LTC6813 - 1:多節(jié)電池堆棧監(jiān)測的理想選擇

    深入剖析LTC6813 - 1:多節(jié)電池堆棧監(jiān)測的理想選擇 作為一名電子工程師,在設(shè)計(jì)電池管理系統(tǒng)時(shí),高效、精確的電池監(jiān)測芯片至關(guān)重要。今天,咱們就來深入探討一款優(yōu)秀的電池監(jiān)測芯片——LTC6813
    的頭像 發(fā)表于 02-24 11:10 ?348次閱讀

    深入剖析LTC6810-1/LTC6810-2:6通道電池堆棧監(jiān)控器的卓越之選

    深入剖析LTC6810-1/LTC6810-2:6通道電池堆棧監(jiān)控器的卓越之選 在電子工程師的日常工作中,電池管理系統(tǒng)的設(shè)計(jì)至關(guān)重要,而一款優(yōu)秀的電池堆棧監(jiān)控器能為系統(tǒng)的穩(wěn)定性和可靠性提供有
    的頭像 發(fā)表于 02-12 16:45 ?2539次閱讀

    在學(xué)單片機(jī)時(shí)在堆棧遇到的問題分享

    一個(gè)堆棧溢出時(shí)會(huì)偶然產(chǎn)生壞的事情,你可以使用堆棧檢查函數(shù)檢測溢出情況 。 關(guān)于堆棧檢查函數(shù): 啟動(dòng)代碼在硬件堆棧和軟件
    發(fā)表于 01-23 07:47

    堆棧的原理揭秘

    1. 什么是堆棧?單片機(jī)應(yīng)用中,堆棧是個(gè)特殊存儲(chǔ)區(qū),堆棧屬于RAM空間的一部分,堆棧用于函數(shù)調(diào)用、中斷切換時(shí)保存和恢復(fù)現(xiàn)場數(shù)據(jù)。堆棧中的物體
    發(fā)表于 01-23 07:08

    【「Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)」閱讀體驗(yàn)】+讀深入理解Linux內(nèi)核內(nèi)存分配

    時(shí)復(fù)用”,在fork()系統(tǒng)調(diào)用中廣泛使用;中斷上下文中發(fā)生的缺頁中斷會(huì)導(dǎo)致雙重故障中斷,通常會(huì)使內(nèi)核崩潰等。經(jīng)過這段時(shí)間的閱讀,收獲頗豐,此書有不少關(guān)于內(nèi)核開發(fā)的新內(nèi)容值得本人深入學(xué)習(xí)借鑒。感謝電子發(fā)燒友平臺(tái)提供的評(píng)閱機(jī)會(huì)。
    發(fā)表于 01-16 20:05

    深入理解分布式共識(shí)算法 Raft

    “不可靠的網(wǎng)絡(luò)”、“不穩(wěn)定的時(shí)鐘”和“節(jié)點(diǎn)的故障”都是在分布式系統(tǒng)中常見的問題,在文章開始前,我們先來看一下:如果在分布式系統(tǒng)中網(wǎng)絡(luò)不可靠會(huì)發(fā)生什么樣的問題。 有以下 3 個(gè)服務(wù)構(gòu)成的分布式集群,并在 server_1 中發(fā)生寫請(qǐng)求變更 A = 1,“正常情況下” server_1 將 A 值同步給 server_2 和 server_3,保證集群的數(shù)據(jù)一致性: 但是如果在數(shù)據(jù)變更時(shí)發(fā)生網(wǎng)絡(luò)問題(延遲、斷連和丟包等)便會(huì)出現(xiàn)以下情況:比如有兩個(gè)寫操作同時(shí)發(fā)生在 server_1 或
    的頭像 發(fā)表于 11-27 14:51 ?444次閱讀
    <b class='flag-5'>深入理解</b>分布式共識(shí)算法 Raft

    堆棧的定義,堆棧的使用方法

    堆棧的定義 堆棧也是用戶使用的存儲(chǔ)器的一部分,用于存放臨時(shí)性的數(shù)據(jù)和一些其他信息。堆棧段的定義語法如下: 堆棧名SEGMENTSTACK (
    發(fā)表于 11-21 06:49

    關(guān)于“實(shí)時(shí)基準(zhǔn)對(duì)比測量”與AI再探討

    他們又提到“還想多問一句”,說明他們對(duì)這個(gè)方案還有疑慮或者想深入理解某些細(xì)節(jié)。 用戶可能是硬件工程師或者系統(tǒng)設(shè)計(jì)師,正在設(shè)計(jì)一個(gè)高精度的測量系統(tǒng),面臨模擬增益控制帶來的穩(wěn)定性挑戰(zhàn)。他們的真實(shí)需求不僅是解決當(dāng)前問題,可能還希望確保方案可行性,避免后期
    的頭像 發(fā)表于 10-14 17:39 ?652次閱讀

    深入理解PTP:高精度時(shí)間同步的核心原理

    PTP實(shí)現(xiàn)高精度的核心在于其精密的測量機(jī)制和對(duì)網(wǎng)絡(luò)延遲的細(xì)致處理。我們以常見的端到端 (End-to-End, E2E) 延遲請(qǐng)求-響應(yīng)機(jī)制為例,來剖析PTP的“對(duì)表”藝術(shù)。
    的頭像 發(fā)表于 09-01 17:41 ?2535次閱讀
    <b class='flag-5'>深入理解</b>PTP:高精度時(shí)間同步的核心原理

    深入理解C語言:C語言循環(huán)控制

    在C語言編程中,循環(huán)結(jié)構(gòu)是至關(guān)重要的,它可以讓程序重復(fù)執(zhí)行特定的代碼塊,從而提高編程效率。然而,為了避免程序進(jìn)入無限循環(huán),C語言提供了多種循環(huán)控制語句,如break、continue和goto,用于改變程序的執(zhí)行流程,使代碼更加靈活和可控。本文將詳細(xì)介紹這些語句的作用及其應(yīng)用場景,并通過示例代碼進(jìn)行說明。Part.1break語句C語言中break語句有兩種
    的頭像 發(fā)表于 04-29 18:49 ?2223次閱讀
    <b class='flag-5'>深入理解</b>C語言:C語言循環(huán)控制
    佛教| 濮阳市| 河间市| 沈阳市| 宿迁市| 五寨县| 库车县| 扶绥县| 靖江市| 江城| 遵义市| 凤凰县| 望奎县| 白水县| 河南省| 西贡区| 乐陵市| 湟源县| 星子县| 榆林市| 安溪县| 庄浪县| 镇江市| 会东县| 涿鹿县| 漯河市| 会泽县| 襄汾县| 浮梁县| 丹寨县| 台中市| 南通市| 乐昌市| 五家渠市| 新郑市| 谢通门县| 洪泽县| 绥宁县| 江安县| 麟游县| 武安市|