亚洲男人天堂av,国产一区二区久久精品,国产精品一区二区久久精品,国产精品久久久久久一区二区三区,五月婷婷在线观看视频,亚洲狠狠色丁香婷婷综合

歡迎您訪問從棧上分配內(nèi)存更快?解析棧指針移動(dòng)的本質(zhì)!

從棧上分配內(nèi)存更快?解析棧指針移動(dòng)的本質(zhì)

更新時(shí)間:2024-09-28 16:41:20作者:佚名

棧區(qū)內(nèi)存申請(qǐng)與釋放

毫無疑問,從堆棧中分配內(nèi)存更快,因?yàn)閺亩褩V蟹峙鋬?nèi)存只是堆棧指針的移動(dòng)。這意味著什么?什么是“堆棧指針移動(dòng)”?以x86平臺(tái)為例,棧上的內(nèi)存分配是如何實(shí)現(xiàn)的?很簡(jiǎn)單,只有一行指令:

sub?$0x40,%rsp

這行代碼被稱為“堆棧指針移動(dòng)”,其本質(zhì)就是這張圖:

leave是什么意思?怎么讀_leave是什么意思譯怎么讀_leave怎么意思

這很簡(jiǎn)單。寄存器esp存放當(dāng)前棧頂?shù)刂贰S捎诙褩5脑鲩L(zhǎng)方向是從高地址到低地址,所以當(dāng)增加堆棧時(shí),需要將堆棧指針向下移動(dòng),這就是sub指令的作用。該指令將堆棧指針向下移動(dòng) 64 個(gè)字節(jié)(0x40),因此可以說在堆棧上分配了 64 個(gè)字節(jié)。

可以看到,在棧上分配內(nèi)存其實(shí)非常非常簡(jiǎn)單,簡(jiǎn)單到只是一條機(jī)器指令。

棧區(qū)的內(nèi)存釋放也很簡(jiǎn)單,只需要一條機(jī)器指令:

leave

leave指令的作用是將棧基地址賦給esp,使棧指針指向上一個(gè)棧幀的棧頂,然后彈出ebp,使ebp指向棧底前一個(gè)堆棧幀的:

leave是什么意思譯怎么讀_leave怎么意思_leave是什么意思?怎么讀

你看,執(zhí)行l(wèi)eave指令后,ebp和esp都指向了上一個(gè)棧幀,相當(dāng)于彈出棧幀。這樣,棧1占用的內(nèi)存就無效了,沒有任何用處。顯然這就是我們經(jīng)常提到的內(nèi)存回收,所以一條簡(jiǎn)單的leave指令就可以回收棧區(qū)的內(nèi)存。

leave是什么意思?怎么讀_leave怎么意思_leave是什么意思譯怎么讀

關(guān)于棧、棧幀和棧區(qū),更詳細(xì)的解釋可以參考我寫的這篇文章。

接下來我們看堆區(qū)的內(nèi)存申請(qǐng)和釋放。

堆區(qū)內(nèi)存申請(qǐng)與釋放

與在堆棧區(qū)域分配內(nèi)存相反的是堆內(nèi)存分配。在堆區(qū)分配內(nèi)存有多復(fù)雜?太復(fù)雜了,我用了兩篇文章來講解“堆內(nèi)存分配”的實(shí)現(xiàn)原理? 》。

在堆區(qū)域申請(qǐng)和釋放內(nèi)存是一個(gè)相對(duì)復(fù)雜的過程,因?yàn)槎驯旧硇枰绦騿T(內(nèi)存分配器實(shí)現(xiàn)者)來管理,而堆棧則由編譯器維護(hù)。堆區(qū)的維護(hù)也涉及到內(nèi)存。分配和釋放,但是這里的內(nèi)存分配和釋放顯然不會(huì)像棧區(qū)那么簡(jiǎn)單。一句話leave是什么意思?怎么讀leave是什么意思?怎么讀,這里就是內(nèi)存的按需分配和釋放。本質(zhì)是堆區(qū)中每塊分配的內(nèi)存的生命周期都是No,這是由程序員決定的。我傾向于將動(dòng)態(tài)內(nèi)存分配和釋放視為去停車場(chǎng)尋找停車位。

leave是什么意思譯怎么讀_leave怎么意思_leave是什么意思?怎么讀

這顯然會(huì)使問題變得復(fù)雜。我們必須仔細(xì)維護(hù)哪些內(nèi)存已分配,哪些是空閑的,如何找到空閑內(nèi)存,如何回收程序員不需要的內(nèi)存塊,同時(shí)不能造成嚴(yán)重后果。在棧區(qū)分配和釋放內(nèi)存時(shí)無需擔(dān)心內(nèi)存碎片問題。同時(shí),當(dāng)堆區(qū)內(nèi)存空間不足時(shí)貝語(yǔ)網(wǎng)校,需要對(duì)堆區(qū)進(jìn)行擴(kuò)展等,這些使得在堆區(qū)申請(qǐng)內(nèi)存比在棧區(qū)分配內(nèi)存更加復(fù)雜。還有很多,具體可以參考我寫的這兩篇文章“””。

說了這么多,在堆上申請(qǐng)內(nèi)存比在棧上申請(qǐng)內(nèi)存慢多少呢?

接下來,我們來寫一些代碼來實(shí)驗(yàn)一下。

顯示代碼

void?test_on_stack()?{
??int?a?=?10;
}

void?test_on_heap()?{
??int*?a?=?(int*)malloc(sizeof(int));
??*a?=?10;
??free(a);
}

void?test()?{
??auto?begin?=?GetTimeStampInUs();
??for?(int?i?=?0;?i?????test_on_stack();
??}
??cout<<"test?on?stack?"<<((GetTimeStampInUs()?-?begin)?/?1000000.0)<
??begin?=?GetTimeStampInUs();
??for?(int?i?=?0;?i?????test_on_heap();
??}
??cout<<"test?on?heap?"<<((GetTimeStampInUs()?-?begin)?/?1000000.0)<}

這段代碼很簡(jiǎn)單,這里有兩個(gè)函數(shù):

然后我們?cè)跍y(cè)試函數(shù)中分別調(diào)用這兩個(gè)函數(shù),每個(gè)函數(shù)被調(diào)用一億次,并記錄其運(yùn)行時(shí)間。得到的測(cè)試結(jié)果為:

test?on?stack?0.191008
test?on?heap?20.0215

可以看到,在棧上總共花費(fèi)的時(shí)間只有0.2s左右,而在堆上分配的時(shí)間卻是20s,相差一百倍。

值得注意的是,編譯程序時(shí)并沒有開啟編譯優(yōu)化。開啟編譯優(yōu)化后的時(shí)間消耗如下:

test?on?stack?0.033521
test?on?heap?0.039294

可以看到它們幾乎是一樣的,但是這是為什么呢?顯然從常識(shí)來看,在棧上分配速度更快。問題是什么?

現(xiàn)在我們開啟了編譯優(yōu)化,優(yōu)化后的代碼運(yùn)行速度是不是更快了呢?我們看一下編譯優(yōu)化后生成的指令:

test_on_stackv:
??400f85:???????55??????????????????????push???%rbp
??400f86:???????48?89?e5????????????????mov????%rsp,%rbp
??400f89:???????5d??????????????????????pop????%rbp
??400f8a:???????c3??????????????????????retq

test_on_heapv:
??400f8b:???????55??????????????????????push???%rbp
??400f8c:???????48?89?e5????????????????mov????%rsp,%rbp
??400f8f:???????5d??????????????????????pop????%rbp
??400f90:???????c3??????????????????????retq

啊哈,編譯器太聰明了。很明顯注意到這兩個(gè)函數(shù)中的代碼實(shí)際上什么也沒做。盡管我們專門將變量a的值賦值為10,但后來我們根本沒有使用變量a。 ,所以編譯器為我們生成了一個(gè)空函數(shù),而上面的機(jī)器指令實(shí)際上對(duì)應(yīng)了一個(gè)空函數(shù)。

小風(fēng)哥在這里反復(fù)添加代碼,沒有騙過編譯器。我試圖增加分配變量a的復(fù)雜性,但編譯器仍然巧妙地生成了一個(gè)空函數(shù)。反正我沒嘗試過。可以看出,現(xiàn)代編譯器足夠智能,生成的機(jī)器指令非常高效。關(guān)于如何編寫更好的基準(zhǔn)測(cè)試,以便我們可以看到打開編譯優(yōu)化時(shí)這兩種內(nèi)存分配方法的比較。任何對(duì)此有任何疑問的人都?xì)g迎。請(qǐng)各位有經(jīng)驗(yàn)或者有編譯優(yōu)化經(jīng)驗(yàn)的同學(xué)留言。

最后我們看一下這兩種內(nèi)存分配方式的定位。

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

首先,我們必須認(rèn)識(shí)到堆棧是先進(jìn)后出的結(jié)構(gòu)。堆棧區(qū)域會(huì)隨著函數(shù)調(diào)用級(jí)別的增加而增加,并隨著函數(shù)調(diào)用的完成而減少。因此,棧不需要任何“管理”;同時(shí),由于棧的性質(zhì),棧上申請(qǐng)的內(nèi)存的生命周期與函數(shù)是綁定的。當(dāng)函數(shù)調(diào)用完成后,其所占用的棧幀內(nèi)存將失效,并且棧的大小是有限的。你不能在堆棧上申請(qǐng)?zhí)嗟膬?nèi)存,就像這段C代碼:

void?test()?{
??int?b[10000000];
??b[1000000]?=?10;
}

這段代碼運(yùn)行后會(huì)核心出來。原因是堆棧區(qū)域的大小非常有限。在堆棧上分配大塊數(shù)據(jù)會(huì)使堆棧爆裂。這就是所謂的堆棧溢出:

leave是什么意思譯怎么讀_leave是什么意思?怎么讀_leave怎么意思

前額。 。 。抱歉,圖片放錯(cuò)地方了,應(yīng)該是這個(gè)Stack Overflow:

leave怎么意思_leave是什么意思?怎么讀_leave是什么意思譯怎么讀

抱歉,我又搞錯(cuò)了,不過你明白的。

堆不同。堆上分配的內(nèi)存的生命周期由程序員控制。程序員決定何時(shí)申請(qǐng)內(nèi)存、何時(shí)釋放內(nèi)存。因此,必須對(duì)堆進(jìn)行管理。堆區(qū)域非常廣闊。區(qū),當(dāng)堆區(qū)不足時(shí),會(huì)請(qǐng)求操作系統(tǒng)擴(kuò)展堆區(qū)以獲得更多的地址空間。

當(dāng)然,雖然堆區(qū)給了程序員更大的靈活性,但是程序員需要保證內(nèi)存在不使用的時(shí)候被釋放,否則就會(huì)出現(xiàn)內(nèi)存泄漏。在棧上申請(qǐng)內(nèi)存就不存在這個(gè)問題。

總結(jié)

棧區(qū)是自動(dòng)管理的,堆區(qū)是手動(dòng)管理的。顯然,在堆棧區(qū)域上分配內(nèi)存比在堆區(qū)域上分配內(nèi)存要快。當(dāng)棧區(qū)申請(qǐng)的內(nèi)存使用場(chǎng)景有限時(shí),程序員在申請(qǐng)內(nèi)存時(shí)就得更加小心。大多數(shù)都是依賴堆區(qū),但是如果棧區(qū)申請(qǐng)的內(nèi)存滿足要求的話,我個(gè)人更傾向于使用棧區(qū)內(nèi)存。

希望這篇文章能夠幫助大家了解堆區(qū)和棧區(qū)。

為您推薦

句子篇章朗讀技巧及考查題型解析

本題型在考查單詞發(fā)音準(zhǔn)確性的基礎(chǔ)上,還考查考生朗讀的完整性和流暢性。連讀是指在同一個(gè)意群中,前一個(gè)單詞末尾的音和后一個(gè)單詞開頭的音連起來讀的現(xiàn)象。重讀單詞一般是句子中表達(dá)實(shí)際意義的詞。非重讀單詞通常是句中無實(shí)際意義的詞。一個(gè)單詞是否重讀,與它在句子中表達(dá)的意思相關(guān)。

2024-09-28 16:19

dinosaurs是什么意思_dinosaurs怎么讀_dinosaurs翻譯_用法_發(fā)音_詞組_同反義詞

dinosaurs的基本釋義為 基本解釋 n. <生>恐龍( dinosaur的名詞復(fù)數(shù) );守舊落伍的人,過時(shí)落后的東西等等。貝語(yǔ)網(wǎng)校(www.hfjinjia.cn)為您提供dinosaurs發(fā)音,英語(yǔ)單詞dinosaurs的音標(biāo),dinosaurs中文意思,dinosaurs的過去式,dinosaurs雙語(yǔ)例句等相關(guān)英語(yǔ)知識(shí)。

2024-09-27 12:27

dining是什么意思_dining怎么讀_dining翻譯_用法_發(fā)音_詞組_同反義詞

dining的基本釋義為 基本解釋 n. 進(jìn)餐v. 吃飯,進(jìn)餐( dine的現(xiàn)在分詞 );設(shè)宴款待,請(qǐng)客等等。貝語(yǔ)網(wǎng)校(www.hfjinjia.cn)為您提供dining發(fā)音,英語(yǔ)單詞dining的音標(biāo),dining中文意思,dining的過去式,dining雙語(yǔ)例句等相關(guān)英語(yǔ)知識(shí)。

2024-09-27 12:25

dignified是什么意思_dignified怎么讀_dignified翻譯_用法_發(fā)音_詞組_同反義詞

dignified的基本釋義為 基本解釋 adj. 有尊嚴(yán)的;莊嚴(yán)的;高貴的;厚重等等。貝語(yǔ)網(wǎng)校(www.hfjinjia.cn)為您提供dignified發(fā)音,英語(yǔ)單詞dignified的音標(biāo),dignified中文意思,dignified的過去式,dignified雙語(yǔ)例句等相關(guān)英語(yǔ)知識(shí)。

2024-09-27 12:23

digits是什么意思_digits怎么讀_digits翻譯_用法_發(fā)音_詞組_同反義詞

digits的基本釋義為 基本解釋 n. 數(shù)字( digit的名詞復(fù)數(shù) );手指,足趾等等。貝語(yǔ)網(wǎng)校(www.hfjinjia.cn)為您提供digits發(fā)音,英語(yǔ)單詞digits的音標(biāo),digits中文意思,digits的過去式,digits雙語(yǔ)例句等相關(guān)英語(yǔ)知識(shí)。

2024-09-27 12:23

digital是什么意思_digital怎么讀_digital翻譯_用法_發(fā)音_詞組_同反義詞

digital的基本釋義為 基本解釋 adj. 數(shù)字的;數(shù)據(jù)的;手指的;指狀的n. 手指;(鋼琴等的)琴鍵;數(shù)字等等。貝語(yǔ)網(wǎng)校(www.hfjinjia.cn)為您提供digital發(fā)音,英語(yǔ)單詞digital的音標(biāo),digital中文意思,digital的過去式,digital雙語(yǔ)例句等相關(guān)英語(yǔ)知識(shí)。

2024-09-27 12:22

加載中...
主站蜘蛛池模板: 成人国内精品久久久久影院 | 国产免费黄色网址 | 日韩成人在线观看视频 | 九九365资源稳定资源站 | 国产成人一区二区三区视频免费蜜 | 国产精品深夜福利免费观看 | 天堂男人网 | 男女视频网址 | 亚洲五月花丁香花社区 | 迅雷电影影院在线视频播放 | 羞羞网站在线看 | 羞羞动漫网站入口 | 国产福利专区精品视频 | 一区二区三区高清不卡 | 羞羞视频免费网站日本 | 婷婷六月久久综合丁香可观看 | 在线视频亚洲一区 | 男人天堂资源站 | 日本精品视频在线播放 | 亚洲欧美一区二区三区综合 | 在线观看网址入口2020国产 | 在线观看你懂 | 亚洲 欧美 激情 另类 自拍 | 一区二区三区不卡在线观看 | 男女免费视频网站 | 亚洲狠狠综合久久 | 色www永久免费视频 免费羞羞视频网站 | 蜜桃视频一区二区在线观看 | 九九视频在线播放 | 亚洲视频自拍偷拍 | 久久久久久亚洲精品中文字幕 | 欧美视频在线观看一区二区 | 伊人国产在线视频 | 久久99亚洲综合精品首页 | 亚洲男女天堂 | 欧美性色视频 | 美女隐私羞羞视频在线观看 | 自拍欧美亚洲 | 亚洲人免费 | 深爱激情站| 久久99精品久久久久久 |