欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

C++中堆棧與函數(shù)如何調(diào)用-創(chuàng)新互聯(lián)

這篇文章主要為大家展示了“C++中堆棧與函數(shù)如何調(diào)用”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“C++中堆棧與函數(shù)如何調(diào)用”這篇文章吧。

成都創(chuàng)新互聯(lián)是一家網(wǎng)站設(shè)計(jì)公司,集創(chuàng)意、互聯(lián)網(wǎng)應(yīng)用、軟件技術(shù)為一體的創(chuàng)意網(wǎng)站建設(shè)服務(wù)商,主營(yíng)產(chǎn)品:成都響應(yīng)式網(wǎng)站建設(shè)公司、成都品牌網(wǎng)站建設(shè)、成都營(yíng)銷網(wǎng)站建設(shè)。我們專注企業(yè)品牌在網(wǎng)站中的整體樹立,網(wǎng)絡(luò)互動(dòng)的體驗(yàn),以及在手機(jī)等移動(dòng)端的優(yōu)質(zhì)呈現(xiàn)。網(wǎng)站建設(shè)、成都網(wǎng)站制作、移動(dòng)互聯(lián)產(chǎn)品、網(wǎng)絡(luò)運(yùn)營(yíng)、VI設(shè)計(jì)、云產(chǎn)品.運(yùn)維為核心業(yè)務(wù)。為用戶提供一站式解決方案,我們深知市場(chǎng)的競(jìng)爭(zhēng)激烈,認(rèn)真對(duì)待每位客戶,為客戶提供賞析悅目的作品,網(wǎng)站的價(jià)值服務(wù)。

一 C++程序內(nèi)存分配

1) 在棧上創(chuàng)建。在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲(chǔ)單元都在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,一般使用寄存器來(lái)存取,效率很高,但是分配的內(nèi)存容量有限。
2) 從堆上分配,亦稱動(dòng)態(tài)內(nèi)存分配。程序在運(yùn)行的時(shí)候用malloc或new申請(qǐng)任意多少的內(nèi)存,程序員自己負(fù)責(zé)在何時(shí)用free或delete來(lái)釋放內(nèi)存。動(dòng)態(tài)內(nèi)存的生存期由程序員自己決定,使用非常靈活。
3) 從靜態(tài)存儲(chǔ)區(qū)域分配。內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在。例如全局變量,static變量。
4) 文字常量分配在文字常量區(qū),程序結(jié)束后由系統(tǒng)釋放。
5)程序代碼區(qū)。

經(jīng)典實(shí)例:(代碼來(lái)自網(wǎng)絡(luò)高手,沒有找到原作者)

C++中堆棧與函數(shù)如何調(diào)用C++中堆棧與函數(shù)如何調(diào)用Code
#include <string>

undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined

二 三種內(nèi)存對(duì)象的比較
棧對(duì)象的優(yōu)勢(shì)是在適當(dāng)?shù)臅r(shí)候自動(dòng)生成,又在適當(dāng)?shù)臅r(shí)候自動(dòng)銷毀,不需要程序員操心;而且棧對(duì)象的創(chuàng)建速度一般較堆對(duì)象快,因?yàn)榉峙涠褜?duì)象時(shí),會(huì)調(diào)用operator new操作,operator new會(huì)采用某種內(nèi)存空間搜索算法,而該搜索過程可能是很費(fèi)時(shí)間的,產(chǎn)生棧對(duì)象則沒有這么麻煩,它僅僅需要移動(dòng)棧頂指針就可以了。但是要注意的是,通常??臻g容量比較小,一般是1MB~2MB,所以體積比較大的對(duì)象不適合在棧中分配。特別要注意遞歸函數(shù)中好不要使用棧對(duì)象,因?yàn)殡S著遞歸調(diào)用深度的增加,所需的??臻g也會(huì)線性增加,當(dāng)所需棧空間不夠時(shí),便會(huì)導(dǎo)致棧溢出,這樣就會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤。
堆對(duì)象創(chuàng)建和銷毀都要由程序員負(fù)責(zé),所以,如果處理不好,就會(huì)發(fā)生內(nèi)存問題。如果分配了堆對(duì)象,卻忘記了釋放,就會(huì)產(chǎn)生內(nèi)存泄漏;而如 果已釋放了對(duì)象,卻沒有將相應(yīng)的指針置為NULL,該指針就是所謂的“懸掛指針”,再度使用此指針時(shí),就會(huì)出現(xiàn)非法訪問,嚴(yán)重時(shí)就導(dǎo)致程序崩潰。但是高效的使用堆對(duì)象也可以大大的提高代碼質(zhì)量。比如,我們需要?jiǎng)?chuàng)建一個(gè)大對(duì)象,且需要被多個(gè)函數(shù)所訪問,那么這個(gè)時(shí)候創(chuàng)建一個(gè)堆對(duì)象無(wú)疑是良好的選擇,因?yàn)槲覀兺ㄟ^在各個(gè)函數(shù)之間傳遞這個(gè)堆對(duì)象的指針,便可以實(shí)現(xiàn)對(duì)該對(duì)象的共享,相比整個(gè)對(duì)象的傳遞,大大的降低了對(duì)象的拷貝時(shí)間。另外,相比于??臻g,堆的容量要大得多。實(shí)際上,當(dāng)物理內(nèi)存不夠時(shí),如果這時(shí)還需要生成新的堆對(duì)象,通常不會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤,而是系統(tǒng)會(huì)使用虛擬內(nèi)存來(lái)擴(kuò)展實(shí)際的物理內(nèi)存。
靜態(tài)存儲(chǔ)區(qū)。所有的靜態(tài)對(duì)象、全局對(duì)象都于靜態(tài)存儲(chǔ)區(qū)分配。關(guān)于全局對(duì)象,是在main()函數(shù)執(zhí)行前就分配好了的。其實(shí),在main()函數(shù)中的顯示代 碼執(zhí)行之前,會(huì)調(diào)用一個(gè)由編譯器生成的_main()函數(shù),而_main()函數(shù)會(huì)進(jìn)行所有全局對(duì)象的的構(gòu)造及初始化工作。而在main()函數(shù)結(jié)束之 前,會(huì)調(diào)用由編譯器生成的exit函數(shù),來(lái)釋放所有的全局對(duì)象。比如下面的代碼:

void main(void)
{
… …// 顯式代碼
}

實(shí)際上,被轉(zhuǎn)化成這樣:

void main(void)
{
_main(); //隱式代碼,由編譯器產(chǎn)生,用以構(gòu)造所有全局對(duì)象
… … // 顯式代碼
… …
exit() ; // 隱式代碼,由編譯器產(chǎn)生,用以釋放所有全局對(duì)象
}

除了全局靜態(tài)對(duì)象,還有局部靜態(tài)對(duì)象通和class的靜態(tài)成員,局部靜態(tài)對(duì)象是在函數(shù)中定義的,就像棧對(duì)象一樣,只不過,其前面多了個(gè)static關(guān)鍵字。局部靜態(tài)對(duì)象的生命期是從其所在函數(shù)第一次被調(diào)用,更確切地說,是當(dāng)?shù)谝淮螆?zhí)行到該靜態(tài)對(duì)象的聲明代碼時(shí),產(chǎn)生該靜態(tài)局部對(duì)象,直到整個(gè)程序結(jié)束時(shí),才銷毀該對(duì)象。class的靜態(tài)成員的生命周期是該class的第一次調(diào)用到程序的結(jié)束。

三 函數(shù)調(diào)用與堆棧

1)編譯器一般使用棧來(lái)存放函數(shù)的參數(shù),局部變量等來(lái)實(shí)現(xiàn)函數(shù)調(diào)用。有時(shí)候函數(shù)有嵌套調(diào)用,這個(gè)時(shí)候棧中會(huì)有多個(gè)函數(shù)的信息,每個(gè)函數(shù)占用一個(gè)連續(xù)的區(qū)域。一個(gè)函數(shù)占用的區(qū)域被稱作幀(frame)。同時(shí)棧是線程獨(dú)立的,每個(gè)線程都有自己的棧。例如下面簡(jiǎn)單的函數(shù)調(diào)用:

C++中堆棧與函數(shù)如何調(diào)用

另外函數(shù)堆棧的清理方式?jīng)Q定了當(dāng)函數(shù)調(diào)用結(jié)束時(shí)由調(diào)用函數(shù)或被調(diào)用函數(shù)來(lái)清理函數(shù)幀,在VC中對(duì)函數(shù)棧的清理方式由兩種:


參數(shù)傳遞順序誰(shuí)負(fù)責(zé)清理參數(shù)占用的堆棧
__stdcall從右到左被調(diào)函數(shù)
__cdecl從右到左調(diào)用者

2) 有了上面的知識(shí)為鋪墊,我們下面細(xì)看一個(gè)函數(shù)的調(diào)用時(shí)堆棧的變化:

代碼如下:

C++中堆棧與函數(shù)如何調(diào)用C++中堆棧與函數(shù)如何調(diào)用Code
int Add(int x, int y)
{
    return x + y;
}

undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined

對(duì)上面的代碼,我們分為四步,當(dāng)然我們只畫出了我們的代碼對(duì)堆棧的影響,其他的我們假設(shè)它們不存在,哈哈!

第一,int *pi = new int(10);   int *pj = new int(20);   int result = 0; 堆棧變化如下:

C++中堆棧與函數(shù)如何調(diào)用

第二,Add(*pi,*pj);堆棧如下:

C++中堆棧與函數(shù)如何調(diào)用

第三,將Add的結(jié)果給result,堆棧如下:

C++中堆棧與函數(shù)如何調(diào)用

第四,delete pi;    delete pj; 堆棧如下:

C++中堆棧與函數(shù)如何調(diào)用

第五,當(dāng)main()退出后,堆棧如下,等同于main執(zhí)行前,哈哈!

C++中堆棧與函數(shù)如何調(diào)用


以上是“C++中堆棧與函數(shù)如何調(diào)用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

本文題目:C++中堆棧與函數(shù)如何調(diào)用-創(chuàng)新互聯(lián)
本文URL:http://aaarwkj.com/article16/gdhdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、虛擬主機(jī)、服務(wù)器托管、ChatGPT、Google、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
欧美 日本国产一区| 国产一级二级三级久久| 国产精品视频在线播放| 在线日韩观看免费av| 色婷婷激一区二区三区| 老熟女乱色一区二区三区| 综合激情丁香久久狠狠| 妞干网视频这里只有精品| 四虎精品视频在线播放| 国产一区二区91精品| 成人午夜激情在线免费观看| 亚洲欧洲精品真人av蜜臀| 四虎在线观看精品一区| 成人黄色片久久久大全| 国产亚洲一区二区三区在线| 亚洲天堂日韩欧美在线一区| 国产精品成人一区二区艾草| 久草福利视频免费播放| 国模一区二区三区视频| 亚洲香蕉av一区二区蜜桃| 人妻av一区二区三区| 国产精品大屁股白浆一区二区| 91精品国产人妻女教师| 国产精品av在线网站| 日韩国产欧美亚洲一区| 一区二区三区在线观看淫| 91精品国产综合久久男男| 亚洲热妇热女久久精品| 国产成人性生交大片免费| 免费观看中国性生活片| 91国产性感美女视频| 国产高清大片一级黄色| 成人午夜激情在线观看| 亚洲第一青青草原在线| 99热精品成人免费观看| 91精品麻豆国产自产在线| 十八禁在线观看网址免费| 日本最新一区二区三区视频| 美腿丝袜亚洲综合一区| 国产一区欧美二区日韩三区| 日韩精品综合成人欧美|