日本午夜一本久久久综合_免费日韩电影_亚洲激情视频_国产超碰91_不卡的电视剧免费网站有什么_佐佐木明希av_成人精品免费网站_久久婷婷国产91天堂综合精品_91在线观看地址_亚洲自拍欧美另类_日韩黄色三级在线观看_一区在线中文字幕

歡迎您訪問從棧上分配內存更快?解析棧指針移動的本質!

從棧上分配內存更快?解析棧指針移動的本質

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

棧區內存申請與釋放

毫無疑問,從堆棧中分配內存更快,因為從堆棧中分配內存只是堆棧指針的移動。這意味著什么?什么是“堆棧指針移動”?以x86平臺為例,棧上的內存分配是如何實現的?很簡單,只有一行指令:

sub?$0x40,%rsp

這行代碼被稱為“堆棧指針移動”,其本質就是這張圖:

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

這很簡單。寄存器esp存放當前棧頂地址。由于堆棧的增長方向是從高地址到低地址,所以當增加堆棧時,需要將堆棧指針向下移動,這就是sub指令的作用。該指令將堆棧指針向下移動 64 個字節(0x40),因此可以說在堆棧上分配了 64 個字節。

可以看到,在棧上分配內存其實非常非常簡單,簡單到只是一條機器指令。

棧區的內存釋放也很簡單,只需要一條機器指令:

leave

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

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

你看,執行leave指令后,ebp和esp都指向了上一個棧幀,相當于彈出棧幀。這樣,棧1占用的內存就無效了,沒有任何用處。顯然這就是我們經常提到的內存回收,所以一條簡單的leave指令就可以回收棧區的內存。

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

關于棧、棧幀和棧區,更詳細的解釋可以參考我寫的這篇文章。

接下來我們看堆區的內存申請和釋放。

堆區內存申請與釋放

與在堆棧區域分配內存相反的是堆內存分配。在堆區分配內存有多復雜?太復雜了,我用了兩篇文章來講解“堆內存分配”的實現原理? 》。

在堆區域申請和釋放內存是一個相對復雜的過程,因為堆本身需要程序員(內存分配器實現者)來管理,而堆棧則由編譯器維護。堆區的維護也涉及到內存。分配和釋放,但是這里的內存分配和釋放顯然不會像棧區那么簡單。一句話leave是什么意思?怎么讀leave是什么意思?怎么讀,這里就是內存的按需分配和釋放。本質是堆區中每塊分配的內存的生命周期都是No,這是由程序員決定的。我傾向于將動態內存分配和釋放視為去停車場尋找停車位。

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

這顯然會使問題變得復雜。我們必須仔細維護哪些內存已分配,哪些是空閑的,如何找到空閑內存,如何回收程序員不需要的內存塊,同時不能造成嚴重后果。在棧區分配和釋放內存時無需擔心內存碎片問題。同時,當堆區內存空間不足時貝語網校,需要對堆區進行擴展等,這些使得在堆區申請內存比在棧區分配內存更加復雜。還有很多,具體可以參考我寫的這兩篇文章“””。

說了這么多,在堆上申請內存比在棧上申請內存慢多少呢?

接下來,我們來寫一些代碼來實驗一下。

顯示代碼

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)<}

這段代碼很簡單,這里有兩個函數:

然后我們在測試函數中分別調用這兩個函數,每個函數被調用一億次,并記錄其運行時間。得到的測試結果為:

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

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

值得注意的是,編譯程序時并沒有開啟編譯優化。開啟編譯優化后的時間消耗如下:

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

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

現在我們開啟了編譯優化,優化后的代碼運行速度是不是更快了呢?我們看一下編譯優化后生成的指令:

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

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

小風哥在這里反復添加代碼,沒有騙過編譯器。我試圖增加分配變量a的復雜性,但編譯器仍然巧妙地生成了一個空函數。反正我沒嘗試過。可以看出,現代編譯器足夠智能,生成的機器指令非常高效。關于如何編寫更好的基準測試,以便我們可以看到打開編譯優化時這兩種內存分配方法的比較。任何對此有任何疑問的人都歡迎。請各位有經驗或者有編譯優化經驗的同學留言。

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

棧內存和堆內存的區別

首先,我們必須認識到堆棧是先進后出的結構。堆棧區域會隨著函數調用級別的增加而增加,并隨著函數調用的完成而減少。因此,棧不需要任何“管理”;同時,由于棧的性質,棧上申請的內存的生命周期與函數是綁定的。當函數調用完成后,其所占用的棧幀內存將失效,并且棧的大小是有限的。你不能在堆棧上申請太多的內存,就像這段C代碼:

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

這段代碼運行后會核心出來。原因是堆棧區域的大小非常有限。在堆棧上分配大塊數據會使堆棧爆裂。這就是所謂的堆棧溢出:

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

前額。 。 。抱歉,圖片放錯地方了,應該是這個Stack Overflow:

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

抱歉,我又搞錯了,不過你明白的。

堆不同。堆上分配的內存的生命周期由程序員控制。程序員決定何時申請內存、何時釋放內存。因此,必須對堆進行管理。堆區域非常廣闊。區,當堆區不足時,會請求操作系統擴展堆區以獲得更多的地址空間。

當然,雖然堆區給了程序員更大的靈活性,但是程序員需要保證內存在不使用的時候被釋放,否則就會出現內存泄漏。在棧上申請內存就不存在這個問題。

總結

棧區是自動管理的,堆區是手動管理的。顯然,在堆棧區域上分配內存比在堆區域上分配內存要快。當棧區申請的內存使用場景有限時,程序員在申請內存時就得更加小心。大多數都是依賴堆區,但是如果棧區申請的內存滿足要求的話,我個人更傾向于使用棧區內存。

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

為您推薦

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

本題型在考查單詞發音準確性的基礎上,還考查考生朗讀的完整性和流暢性。連讀是指在同一個意群中,前一個單詞末尾的音和后一個單詞開頭的音連起來讀的現象。重讀單詞一般是句子中表達實際意義的詞。非重讀單詞通常是句中無實際意義的詞。一個單詞是否重讀,與它在句子中表達的意思相關。

2024-09-28 16:19

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

dinosaurs的基本釋義為 基本解釋 n. <生>恐龍( dinosaur的名詞復數 );守舊落伍的人,過時落后的東西等等。貝語網校(www.inrixtraffic.com.cn)為您提供dinosaurs發音,英語單詞dinosaurs的音標,dinosaurs中文意思,dinosaurs的過去式,dinosaurs雙語例句等相關英語知識。

2024-09-27 12:27

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

dining的基本釋義為 基本解釋 n. 進餐v. 吃飯,進餐( dine的現在分詞 );設宴款待,請客等等。貝語網校(www.inrixtraffic.com.cn)為您提供dining發音,英語單詞dining的音標,dining中文意思,dining的過去式,dining雙語例句等相關英語知識。

2024-09-27 12:25

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

dignified的基本釋義為 基本解釋 adj. 有尊嚴的;莊嚴的;高貴的;厚重等等。貝語網校(www.inrixtraffic.com.cn)為您提供dignified發音,英語單詞dignified的音標,dignified中文意思,dignified的過去式,dignified雙語例句等相關英語知識。

2024-09-27 12:23

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

digits的基本釋義為 基本解釋 n. 數字( digit的名詞復數 );手指,足趾等等。貝語網校(www.inrixtraffic.com.cn)為您提供digits發音,英語單詞digits的音標,digits中文意思,digits的過去式,digits雙語例句等相關英語知識。

2024-09-27 12:23

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

digital的基本釋義為 基本解釋 adj. 數字的;數據的;手指的;指狀的n. 手指;(鋼琴等的)琴鍵;數字等等。貝語網校(www.inrixtraffic.com.cn)為您提供digital發音,英語單詞digital的音標,digital中文意思,digital的過去式,digital雙語例句等相關英語知識。

2024-09-27 12:22

加載中...
国产女人在线视频| 欧美黄视频在线观看| 欧美日韩国产91| 亚洲三级国产| 国产激情99| 久久亚洲精品中文字幕冲田杏梨 | 黄色三级电影网| 亚洲国产精品黑人久久久| 91在线观看入口| 欧美一区二区三区的| 国产欧美丝祙| 免费观看在线午夜影视| 国产高清不卡av| 日韩欧美在线国产| 韩日在线一区| 亚洲大胆人体大胆做受1| 欧美午夜精品久久久久免费视 | 在线视频精品| missav|免费高清av在线看| 最新av在线免费观看| 亚洲区在线播放| 大白屁股一区二区视频| 玛雅亚洲电影| 国产精品久久久久久精| 国产精品日本精品| 欧美精品成人一区二区三区四区| 日韩国产在线观看一区| 欧美日韩亚洲国产| 成人黄色免费电影| 国产一区免费观看| 亚洲人成电影网站色www| 国产拍揄自揄精品视频麻豆| heyzo久久| 怡红院在线播放| 九色porny91| 国产免费一区视频观看免费| 亚洲精品suv精品一区二区| 91麻豆蜜桃一区二区三区| 99久久精品网站| 密臀av在线| 国产特级毛片| 日韩第一页在线观看| 国产精品自产拍在线观看中文| 欧美一区二区视频免费观看| 国产精品免费免费| 日本亚洲视频在线| 99精品在线| 精品久久国产一区| ririsao久久精品一区| 久久mv成人精品亚洲动漫| 自拍偷拍一区二区三区| 91在线中文字幕| 午夜精品一区二区三区在线视| 欧美一区二区私人影院日本| 亚洲精品免费在线播放| 国产欧美日韩另类视频免费观看| 精品一二三四在线| 激情自拍一区| 色婷婷色综合| 亚洲精品aⅴ| julia一区二区三区中文字幕| www.久久ai| 性网站在线播放| 91黑丝在线| www.aqdy爱情电影网| 欧美日韩中文不卡| 怡红院av亚洲一区二区三区h| 国产精品美女免费看| 亚洲欧洲自拍偷拍| 亚洲精品999| 337p日本欧洲亚洲大胆色噜噜| 色欧美日韩亚洲| 午夜av一区二区三区| 亚洲一区视频在线| 一区二区三区丝袜| 最新成人av在线| 亚洲伦理在线精品| 午夜精品一区二区三区电影天堂| 亚洲h在线观看| 欧美亚洲自拍偷拍| 在线电影国产精品| 欧美一级生活片| 国产一区二区三区久久精品 | 欧美日韩国产一区中文午夜| 懂色av一区二区三区| 欧美日韩国产一二三| 在线成人av影院| 黄色精品一二区| 国产综合激情| 精品在线播放免费| 久久色视频免费观看| 《视频一区视频二区| 五月天一区二区| 欧美日韩亚洲不卡| 尤物yw午夜国产精品视频| 欧美群妇大交群的观看方式| 337p亚洲精品色噜噜噜| 亚洲毛片在线观看| 久久久久久成人| 成人黄色免费网站在线观看| 久久精品国产精品青草色艺| 亚洲欧洲精品在线 | 91免费福利视频| 在线丝袜欧美日韩制服| 一区二区在线观| 97中文字幕| 成年男女免费视频网站不卡| 欧美成人精品一级| 影音先锋日韩在线| eeuss国产一区二区三区| 亚洲成人自拍网| 亚洲人成电影网站| 国产精品入口免费视| 在线成人性视频| 欧美aaa一级| www在线看| 欧美理论电影大全| 不卡免费追剧大全电视剧网站| 亚洲国产综合91精品麻豆| 日韩电影中文字幕在线观看| 成人夜晚看av| 免费看国产黄色片| 欧美裸体视频| 136国产福利精品导航网址| 国产精品综合av一区二区国产馆| 天天操天天干天天综合网| 久久天天躁日日躁| 伊人久久青草| 1024视频在线| 91精品国产91久久久久久黑人| 91天堂素人约啪| 日韩精品福利在线| 国产精品久久久久久久久久久久冷| 亚洲国产精品久久久久婷蜜芽| 青草影视电视剧免费播放在线观看| 欧美午夜18电影| 国产成人鲁色资源国产91色综| 欧美群妇大交群中文字幕| 国产美女精品视频| 全部a∨一极品视觉盛宴| 亚洲码欧美码一区二区三区| 久久影院午夜片一区| 日韩中文字幕在线视频| 9久久9毛片又大又硬又粗| 成人一级视频| 久久久久国产成人精品亚洲午夜| 操人视频在线观看欧美| 人妻少妇精品无码专区二区| 久久99久久久精品欧美| av爱爱亚洲一区| 欧美成人免费va影院高清| av无码精品一区二区三区| 加勒比久久高清| 亚洲动漫第一页| 国内一区在线| 国产探花在线观看| 久久99精品国产91久久来源| 亚洲第一av在线| 国产 日韩 欧美在线| heyzo欧美激情| 99久久精品费精品国产| 欧美色偷偷大香| 在线观看视频黄色| 日本亚洲视频| 在线亚洲高清视频| 国产尤物99| av久久网站| 欧美日韩黄色一级片| 国产不卡在线观看| 九色在线网站| 亚洲精品动态| 亚洲码欧美码一区二区三区| 国产欧美精品日韩区二区麻豆天美| 国语自产精品视频在线看| 国产在线传媒| 日本视频中文字幕一区二区三区| 日韩精品一区二区三区四区视频 | 一本大道久久a久久精二百| 亚洲午夜高清视频| 一区二区亚洲视频| 精品婷婷伊人一区三区三| 国产曰肥老太婆无遮挡| 欧美日韩国产在线观看网站| 国产视频精品xxxx| 日本a级黄色| 国产成人啪免费观看软件| 国产精品精品一区二区三区午夜版| 少女频道在线观看高清 | 亚洲激情免费观看| 91.com在线| 日韩亚洲国产欧美| 久久久噜噜噜久噜久久综合| 精品欧美一区二区久久| 中文字幕乱码人妻综合二区三区| 四虎国产精品免费观看| yw.139尤物在线精品视频| 超碰在线caoporen| 亚洲香蕉伊在人在线观| 好男人www社区| eeuss影院一区二区三区|