最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言函數(shù)棧幀的創(chuàng)建與銷毀詳解

 更新時(shí)間:2022年09月08日 12:06:10   作者:保護(hù)小周?  
函數(shù)棧幀(stack frame)就是函數(shù)調(diào)用過程中在程序的調(diào)用棧(call stack)所開辟的空間,下面這篇文章主要給大家介紹了關(guān)于C語言函數(shù)棧幀的創(chuàng)建與銷毀的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

C語言,我們學(xué)到了這里,一定會(huì)有許多疑惑,我們的代碼邏輯,定義的變量,自定義的函數(shù)等通過編譯器,準(zhǔn)確的來講是集成開發(fā)環(huán)境(vs),預(yù)處理、編譯、匯編、鏈接,在電腦上執(zhí)行的過程中,計(jì)算機(jī)內(nèi)部到底是怎么運(yùn)行的,我們要搞清楚這些基礎(chǔ)的過程,而不是說,因?yàn)檫@樣做,所以有什么樣的結(jié)果,過程是怎么樣的,我們一概不了解,這樣學(xué)編程是不對(duì)的,要刨根問底,增強(qiáng)自己的內(nèi)功。保姆級(jí)講述包您一看就會(huì),快來試試吧~

舉個(gè)例子:

int main()
{
    int a=0;
    return 0;
}

根據(jù)以上代碼,我們可以讀出一段信息,定義一個(gè)局部整型變量 a,并將他初始化為0,同時(shí)一個(gè)整型變量在內(nèi)存中占4個(gè)字節(jié)。關(guān)于main()函數(shù)的返回值啊,簡單說一下,如果返回值為0,則說明程序是正常結(jié)束,非0,就是不正常結(jié)束,且返回值為整型數(shù)據(jù)。

那么博主在這里問大家兩個(gè)問題:

  • 局部整型變量a,到底是怎么創(chuàng)建的?
  • 如果我們對(duì)變量a不進(jìn)行初始化操作,局部變量a的值是多少?
  • main()函數(shù)也有返回值,那他是不是也是也被其他函數(shù)調(diào)用?

函數(shù)在調(diào)用的過程中棧幀的創(chuàng)建和銷毀對(duì)于不同的編譯器來說略有差異,但大體的邏輯是差不多的。取決于編譯器。

 什么是函數(shù)棧幀?

 每一次函數(shù)的調(diào)用,操作系統(tǒng)都會(huì)在內(nèi)存的棧區(qū)上開辟一塊空間,稱為棧幀。

函數(shù)調(diào)用建立棧幀,棧幀中存儲(chǔ)局部變量,參數(shù)等等。

 

棧區(qū),堆區(qū)等是操作系統(tǒng)這門學(xué)科中對(duì)內(nèi)存的劃分,數(shù)據(jù)結(jié)構(gòu)的“棧”,“堆”是存放、處理數(shù)據(jù)的一種結(jié)構(gòu),跟內(nèi)存的棧區(qū),堆區(qū),沒有啥關(guān)系,但是有一點(diǎn),數(shù)據(jù)結(jié)構(gòu)的“棧”和內(nèi)存的棧區(qū)都是后進(jìn)先出,先進(jìn)后出的特性。

 舉個(gè)例子:

在main() 函數(shù)內(nèi)部的Sum()函數(shù)則是被 main()函數(shù)調(diào)用,Sum()函數(shù)結(jié)束開辟的棧幀被操作系統(tǒng)回收,返回mian()函數(shù)的Sum()函數(shù)調(diào)用點(diǎn),繼續(xù)執(zhí)行程序。

程序順序執(zhí)行 ,執(zhí)行main()函數(shù),遇到 int a=1; 操作系統(tǒng)就會(huì)在內(nèi)存的棧區(qū)上,為main()函數(shù)創(chuàng)建棧幀里,給局部變量 a 分配一塊4個(gè)字節(jié)的空間。同理,局部變量在那個(gè)函數(shù)里創(chuàng)建的,那么就在那個(gè)函數(shù)的棧幀中為其分配空間。函數(shù)在調(diào)用的時(shí)候操作系統(tǒng)會(huì)為函數(shù)預(yù)劃分一片空間,就是所謂的棧幀,由 esp,ebp 兩個(gè)寄存器維護(hù),如果空間不夠了,操作系統(tǒng)會(huì)在這片空間的棧頂(esp)增加空間入棧,esp 可以動(dòng)態(tài)的維護(hù)棧頂。

知識(shí)點(diǎn)普及:

局部變量是在內(nèi)存的棧區(qū)上開辟的,棧區(qū)內(nèi)存的使用習(xí)慣是先使用高地址的空間,后使用低地址的空間,棧區(qū)又是一種先進(jìn)后出,后進(jìn)先出的結(jié)構(gòu),且只能在一端操作。

在為函數(shù)創(chuàng)建棧幀的時(shí)候,會(huì)有很多的寄存器去維護(hù),這一片的可使用空間就會(huì)被初始化為隨機(jī)值,這個(gè)根據(jù)不同的編譯器有不同的初始化方式,這就是我們對(duì)局部變量定義的時(shí)候不進(jìn)行初始化打印隨機(jī)值的原因。

 由圖可見,棧底寄存器 ebp-0E4h 就等于 edi 指向的空間。

不過現(xiàn)在的編譯器很智能,如果沒有初始化局部變量使用的話會(huì)報(bào)錯(cuò),就很強(qiáng),但是大家還是要養(yǎng)成良好的初始化的習(xí)慣。

Sum() 函數(shù)的調(diào)用  

傳參:

把變量a,b 的值分別存儲(chǔ)在 ecx ,eax 寄存器,分別入棧。就相當(dāng)于使用兩塊空間 又將a,b 存儲(chǔ)了一次。這就是形參嘛。

形參是實(shí)參的拷貝!這段形參開辟的空間實(shí)際上還是在main() 函數(shù)的棧幀中。esp 棧頂指針動(dòng)態(tài)維護(hù)。

esp ,edp 如何從main() 棧幀,來維護(hù) Sum() 函數(shù)棧幀:

 區(qū)間實(shí)際上是(ebx,ebp)

 return 會(huì)返回 call 指令的這個(gè)地址,可以繼續(xù)執(zhí)行程序。

C/C++ 程序內(nèi)存分配的幾個(gè)區(qū)域:

1.棧區(qū)(stack):在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲(chǔ)單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限,棧區(qū)主要存放運(yùn)行函數(shù)而分配的局部變量,函數(shù)參數(shù),返回?cái)?shù)據(jù),返回地址等。

2.堆區(qū)(heap):一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)由OS回收。

3.數(shù)據(jù)段(靜態(tài)區(qū))(static)存放全局變量,靜態(tài)變量。程序結(jié)束后由系統(tǒng)釋放。

4.代碼段:存放函數(shù)體(類成員函數(shù)和全局函數(shù))的二進(jìn)制代碼

至此C語言函數(shù)棧幀的創(chuàng)建和銷毀博主已經(jīng)分享完了,相信大家對(duì)這個(gè)函數(shù)怎么建立的、銷毀的,函數(shù)怎么傳參,使用等有了一定的理解,大家可以自己使用匯編代碼,感受一下。

總結(jié)

到此這篇關(guān)于C語言函數(shù)棧幀的創(chuàng)建與銷毀的文章就介紹到這了,更多相關(guān)C語言函數(shù)棧幀內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解在VScode中添加代碼塊(含C++指令生成代碼)

    詳解在VScode中添加代碼塊(含C++指令生成代碼)

    這篇文章主要介紹了詳解在VScode中添加代碼塊(含C++指令生成代碼),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • C++通過自定義函數(shù)找出一個(gè)整數(shù)數(shù)組中第二大數(shù)的方法

    C++通過自定義函數(shù)找出一個(gè)整數(shù)數(shù)組中第二大數(shù)的方法

    這篇文章主要介紹了C++通過自定義函數(shù)找出一個(gè)整數(shù)數(shù)組中第二大數(shù)的方法,涉及C++針對(duì)數(shù)組的遍歷操作相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • 7種排序算法的實(shí)現(xiàn)示例

    7種排序算法的實(shí)現(xiàn)示例

    這篇文章主要介紹了7種排序算法的實(shí)現(xiàn)示例,需要的朋友可以參考下
    2014-05-05
  • OpenCV實(shí)現(xiàn)圖像去噪算法的步驟詳解

    OpenCV實(shí)現(xiàn)圖像去噪算法的步驟詳解

    這篇文章主要為大家介紹了OpenCV中圖像去噪算法的原理,文中通過示例為大家詳細(xì)講解了圖像去噪算法的使用,感興趣的小伙伴可以了解一下
    2022-06-06
  • C++中的String的常用函數(shù)用法

    C++中的String的常用函數(shù)用法

    這篇文章主要介紹了C語言中String的常用函數(shù)用法,對(duì)學(xué)習(xí)String的小伙伴有一定的參考價(jià)值,感興趣的小伙伴可以借鑒一下
    2023-03-03
  • C++實(shí)現(xiàn)五子棋游戲(注釋版)

    C++實(shí)現(xiàn)五子棋游戲(注釋版)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • VSCode如何使用最新的C++20(推薦)

    VSCode如何使用最新的C++20(推薦)

    這篇文章主要介紹了VSCode使用最新的C++20的相關(guān)知識(shí),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • C語言實(shí)現(xiàn)掃雷游戲附注釋

    C語言實(shí)現(xiàn)掃雷游戲附注釋

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)掃雷游戲附注釋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語言實(shí)現(xiàn)簡易掃雷游戲詳解

    C語言實(shí)現(xiàn)簡易掃雷游戲詳解

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡易掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C++實(shí)現(xiàn)判斷字符串是否回文實(shí)例解析

    C++實(shí)現(xiàn)判斷字符串是否回文實(shí)例解析

    這篇文章主要介紹了C++實(shí)現(xiàn)判斷字符串是否回文,其中采用了數(shù)據(jù)結(jié)構(gòu)中棧以及過濾字符等技術(shù),,需要的朋友可以參考下
    2014-07-07

最新評(píng)論

寿宁县| 南汇区| 西安市| 桃江县| 惠安县| 临朐县| 辛集市| 美姑县| 阳原县| 海安县| 黎平县| 平定县| 鄱阳县| 保山市| 沧源| 沙洋县| 苍梧县| 金昌市| 浑源县| 上虞市| 湖北省| 突泉县| 本溪市| 额尔古纳市| 营口市| 蓝田县| 思南县| 漳平市| 西青区| 桂林市| 奈曼旗| 山西省| 和田县| 沂水县| 鄂托克旗| 新干县| 马龙县| 开江县| 象州县| 洮南市| 峨边|