版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C++〔變量〕本章主要介紹幾個(gè)概念變量和常量:bool、char、int、short、long、float、double,留意個(gè)變量的所占的字節(jié)數(shù)。cons區(qū)分。#defineMAX 100 //宏常量constintMAX=100; // C++constchar*p=“helloworld“; //字符串常量全局變量和靜態(tài)變量extern關(guān)鍵字再次聲明這個(gè)全局變量。量。靜態(tài)全局變量作用于其定義它的源文件里,不能作用到其它源文件,即被static數(shù)體始終可見(jiàn)。即假設(shè)全局變量加上static,static,則轉(zhuǎn)變其內(nèi)存存儲(chǔ)位置,不轉(zhuǎn)變其作用域。調(diào)用時(shí),如何實(shí)現(xiàn)?最簡(jiǎn)潔想到的方法是定義一個(gè)全局的變量,但定義為一個(gè)〔使得在此函數(shù)中定義的變量,不僅僅受此函數(shù)把握〕。關(guān)于靜態(tài)變量static的一個(gè)小小的測(cè)試:#include<iostream>usingnamespacestd;intTest(inta){staticintb=5;b+=a;returnb;}intmain{inta=Test(10);cout<<a<<endl;intb=Test(20);cout<<b<<endl;return0;}1、C++編譯的程序占用的內(nèi)存分類(lèi)棧區(qū)〔stack〕:程序運(yùn)行時(shí)由編譯器自動(dòng)安排,存放函數(shù)的參數(shù)值,局部〔heap〕OS,安排方式倒是類(lèi)似于鏈表。靜態(tài)區(qū)〔static〕:編譯器編譯時(shí)即安排內(nèi)存。全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量 初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。程序完畢后由系統(tǒng)釋放。文字常量區(qū):常量字符串就是放在這里的。程序完畢后由系統(tǒng)釋放。程序代碼區(qū):存放函數(shù)體〔類(lèi)成員函數(shù)和全局函數(shù)〕的二進(jìn)制代碼。2、內(nèi)存安排方式有三種程序的整個(gè)運(yùn)行期間都存在。例如全局變量,static在棧上創(chuàng)立:在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲(chǔ)單元都可以在棧上創(chuàng)立指令集中,效率很高,但是安排的內(nèi)存容量有限。freedelete存的生存期由我們打算,使用格外靈敏,但問(wèn)題也最多。變量?jī)?nèi)存分布通過(guò)程序加以說(shuō)明〔1〕變量分布ViewCode運(yùn)行結(jié)果:ViewCode分析結(jié)果〔debug〕:變量在內(nèi)存地址的分布為:棧-堆-代碼區(qū)-全局靜態(tài)-文字常量區(qū)棧中是由高到低的。全局變量和靜態(tài)變量假設(shè)不賦值,默認(rèn)為0。棧中的變量假設(shè)不賦值,則是一個(gè)隨機(jī)的數(shù)據(jù)。,未初始化的全局變量和靜態(tài)變量安排在另一起?!?〕函數(shù)分布ViewCode運(yùn)行結(jié)果ViewCode結(jié)果分析:棧的伸展方向是由高地址向低地址擴(kuò)展的量安排在另一起。程序變量分區(qū)中棧和堆的區(qū)分申請(qǐng)方式intb;系統(tǒng)自動(dòng)bheap:Cmalloc,C++new運(yùn)算符。p1=newchar[10];p2=newchar[20];p1、p2申請(qǐng)后系統(tǒng)的響應(yīng)提示棧溢出。堆:首先應(yīng)當(dāng)知道操作系統(tǒng)有一個(gè)記錄空閑內(nèi)存地址的鏈表,當(dāng)系統(tǒng)收到程序會(huì)在這塊內(nèi)存空間中的首地址處記錄本次安排的大小,這樣,代碼中的delete語(yǔ)句才能正確的釋放本內(nèi)存空間。由于找到的堆結(jié)點(diǎn)的大小不愿定正好等于申請(qǐng)的大小,系統(tǒng)會(huì)自動(dòng)的將多余的那局部重放入空閑鏈表中。申請(qǐng)大小的限制Windows這句話(huà)的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在WINDOWS2M〔1M,總之是一個(gè)編譯時(shí)就確定的常數(shù)〕,假設(shè)申請(qǐng)的空間超過(guò)棧的剩余空間時(shí),將提示overflow較小。間比較靈敏,也比較大。申請(qǐng)效率的比較棧由系統(tǒng)自動(dòng)安排,速度較快。但程序員是無(wú)法把握的。最便利。堆和棧中的存儲(chǔ)內(nèi)容下一條可執(zhí)行語(yǔ)句C當(dāng)本次函數(shù)調(diào)用完畢后,局部變量先出棧,然后是參數(shù),最終棧頂指針指向最開(kāi)頭存的地址,也就是主函數(shù)中的下一條指令,程序由該點(diǎn)連續(xù)運(yùn)行。chars1[]=“a“;char*s2=“b“;abint main{chara=1;charc[]=“1234567890“;char*p=“1234567890“;a=c[1];a=p[1];return0;}對(duì)應(yīng)的匯編代碼10:a=c[1];004010678A4DF1movcl,byteptr[ebp-0Fh]0040106A884DFCmovbyteptr[ebp-4],cl11:a=p[1];0040106D8B55ECmovedx,dwordptr[ebp-14h]004010708A4201moval,byteptr[edx+1]004010738845FCmovbyteptr[ebp-4],alcledxedx小結(jié)堆和棧的主要區(qū)分由以下幾點(diǎn):1、治理方式不同;2、空間大小不同;3、能否產(chǎn)生碎片不同;4、生長(zhǎng)方向不同;5、安排方式不同;6、安排效率不同;memoryleak。324GVC61M從而造成大量的碎片,使程序效率降低。對(duì)于棧來(lái)講,則不會(huì)存在這個(gè)問(wèn)題,的可以參考數(shù)據(jù)構(gòu)造。向;對(duì)于棧來(lái)講,它的生長(zhǎng)方向是向下的,是向著內(nèi)存地址減小的方向增長(zhǎng)。編譯器進(jìn)展釋放,無(wú)需我們手工實(shí)現(xiàn)。的效率比較高。堆則是C/C++函數(shù)庫(kù)供給的,它的機(jī)制是很簡(jiǎn)潔的,例如為了安排一塊內(nèi)存,庫(kù)函數(shù)會(huì)依據(jù)確定的算法〔具體的算法可以參考數(shù)據(jù)構(gòu)造/操作系統(tǒng)〕〔可就有可能調(diào)用系統(tǒng)功能去增加程序數(shù)據(jù)段的內(nèi)存空間,得多。EBP〔除非你是有意使其越界C++〔new/deletevsmalloc/free〕new/deletevsmalloc/freemallocfreeC++/C標(biāo)準(zhǔn)庫(kù)函數(shù),new/deleteC++的運(yùn)算符。malloc/free不在編譯器把握權(quán)限之內(nèi),不能夠把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強(qiáng)加于。因此C++語(yǔ)言需要一個(gè)能完成動(dòng)態(tài)內(nèi)存安排和初始化工作的運(yùn)算符newdeletenew/delete不是庫(kù)函數(shù)。new/deletemalloc/freeC++不把C++CCmalloc/freeC++內(nèi)存治理之五〔數(shù)組vs〕以為兩者是等價(jià)的。但二者有著本質(zhì)的區(qū)分:〕一塊內(nèi)存,其地址與容量在生命期內(nèi)保持不變,只有數(shù)組的內(nèi)容可以轉(zhuǎn)變。針來(lái)操作動(dòng)態(tài)內(nèi)存。指針遠(yuǎn)比數(shù)組靈敏,但也更危急。下面以字符串為例比較指針與數(shù)組的特性:修改內(nèi)容1a6hello。aa[0]=‘X’p“world”〔位于靜態(tài)存儲(chǔ)區(qū),內(nèi)容為world〕,常量字符串的內(nèi)容是不行以被修改的。從語(yǔ)法上看,編譯容而導(dǎo)致運(yùn)行錯(cuò)誤。1修改數(shù)組和指針內(nèi)容chara[]=“hello”;a[0]=‘X’;cout<<a<<endl;char*p=“world”;//pp[0‘X’;//編譯器不能覺(jué)察該錯(cuò)誤cout<<p<<endl;內(nèi)容復(fù)制與比較2中,假設(shè)想把數(shù)組a的內(nèi)容復(fù)制給b,不能用語(yǔ)句b=a,否則將產(chǎn)生編譯錯(cuò)誤。應(yīng)當(dāng)用標(biāo)準(zhǔn)庫(kù)函數(shù)strcpy進(jìn)展復(fù)制。同理,比較baif(b==a)來(lái)推斷,應(yīng)當(dāng)strcmpp,apamallocpstrcpyif(p==a)strcmp實(shí)例2數(shù)組和指針的內(nèi)容復(fù)制與比較//chara[]=“hello“;charb[10];strcpy(b,a);//不能用b=a;if(strcmp(b,a)==0)//不能用if(b==a)?//intlen=strlen(a);char*p=(char*)malloc(sizeof(char)*(len+1));strcpy(p,a);//不要用p=a;if(strcmp(p,a)==0)//不要用if(p==a)?計(jì)算內(nèi)存容量sizeof〔字節(jié)數(shù)〔asizeof(a)12〔留意別忘了’’〕。指針pa,但是sizeof(p4。這sizeof(char*),而申請(qǐng)內(nèi)存時(shí)記住它。留意當(dāng)數(shù)組作為函數(shù)的參數(shù)進(jìn)展傳遞時(shí),該數(shù)組自動(dòng)退化7-3-3〔b〕中,不管數(shù)組asizeof(a)始sizeof(char*)。實(shí)例3(a)計(jì)算數(shù)組和指針的內(nèi)存容量chara[]=“helloworld“;char*p=a;<<endl;//12cout<<sizeof(p)<<endl;//43(b)數(shù)組退化為指針voidFunc(chara[100]){cout<<sizeof(a)<<endl;//4100}指針參數(shù)是如何傳遞內(nèi)存的?4(a)GetMemory(str,200)str,strNULL,為什么?實(shí)例4(a)試圖用指針參數(shù)申請(qǐng)動(dòng)態(tài)內(nèi)存voidGetMemory(char*p,intnum){p=(char*)malloc(sizeof(char)*num);}voidTest(void){char*str=NULL;GetMemory(str,100//strNULLstrcpy(str,“hello“);//運(yùn)行錯(cuò)誤}指針參數(shù)p的副本是_p,編譯器使_p=p。假設(shè)函數(shù)體內(nèi)的程序修改了_p的p_ppGetMemoryGetMemory就free4(b)實(shí)例4(b)用指向指針的指針申請(qǐng)動(dòng)態(tài)內(nèi)存voidGetMemory2(char**p,intnum){*p=(char*)malloc(sizeof(char)*num);}voidTest2(void){char*str=NULL;//留意參數(shù)是&strstrstrcpy(str,“hello“);cout<<str<<endl;free(str);}4(c)實(shí)例4(c) 用函數(shù)返回值來(lái)傳遞動(dòng)態(tài)內(nèi)存char*GetMemory3(intnum){char*p=(char*)malloc(sizeof(char)*num); returnp;}voidTest3(void){char*str=NULL;str=GetMemory3(100);strcpy(str,“hello“);cout<<str<<endl;free(str);}用函數(shù)返回值來(lái)傳遞動(dòng)態(tài)內(nèi)存這種方法雖然好用,但是常常有人把return4(d)實(shí)例4(d)return語(yǔ)句返回指向“棧內(nèi)存”的指針char*GetString(void){charp[]=“helloworld“; returnp;//編譯器將提出警告}voidTest4(void){char*str=NULL;str=GetString;//str的內(nèi)容是垃圾cout<<str<<endl;}用調(diào)試器逐步跟蹤Test4strGetStringstrNULLworld”而是垃圾。4(d4(e),會(huì)怎么樣?4(e)returnchar*GetString2(void)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 遺傳算法流程圖
- 教育部學(xué)科分類(lèi)與代碼(全部)
- 2024購(gòu)銷(xiāo)合同下載范文
- 2024臨時(shí)工解聘協(xié)議書(shū)臨時(shí)工聘用合同協(xié)議書(shū)
- 自然資源安全生產(chǎn)
- 規(guī)劃課題申報(bào)范例:“雙高?!笨?jī)效評(píng)價(jià)研究(附可修改技術(shù)路線(xiàn)圖)
- 深圳大學(xué)《知識(shí)產(chǎn)權(quán)法學(xué)》2021-2022學(xué)年期末試卷
- 副主任醫(yī)師定期考核述職報(bào)告范文(7篇)
- 關(guān)于班組長(zhǎng)安全承諾書(shū)3篇
- 軍訓(xùn)決心書(shū)(集錦15篇)
- 東營(yíng)港加油、LNG加氣站工程環(huán)評(píng)報(bào)告表
- 2024年日歷(打印版每月一張)
- 車(chē)用動(dòng)力電池回收利用 管理規(guī)范 第2部分:回收服務(wù)網(wǎng)點(diǎn)征求意見(jiàn)稿編制說(shuō)明
- 新劍橋少兒英語(yǔ)第六冊(cè)全冊(cè)配套文本
- 科學(xué)預(yù)測(cè)方案
- 職業(yè)生涯規(guī)劃網(wǎng)絡(luò)與新媒體專(zhuān)業(yè)
- T-WAPIA 052.2-2023 無(wú)線(xiàn)局域網(wǎng)設(shè)備技術(shù)規(guī)范 第2部分:終端
- 市政管道開(kāi)槽施工-市政排水管道的施工
- 初中八年級(jí)英語(yǔ)課件Reading Giant pandas-“江南聯(lián)賽”一等獎(jiǎng)2
- 人工智能在教育行業(yè)中的應(yīng)用與管理
- 心衰合并胸腔積液的護(hù)理Ppt
評(píng)論
0/150
提交評(píng)論