初探編譯器static、const之實現原理_第1頁
初探編譯器static、const之實現原理_第2頁
初探編譯器static、const之實現原理_第3頁
初探編譯器static、const之實現原理_第4頁
初探編譯器static、const之實現原理_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、對于許多C/C+初學者,往往知道static變量只是被初始化一次,對于const變量,只知道他的值是不能被修改的,但是對于其實現卻不知所有然。這里我以VC6.0SP6為平臺,揭開其編譯器實現原理。下面看一段程序:引用:#includevoidfun(inti)staticintn=i;int*p=&n;coutn0;-i)fun(i);return0;程序的輸出結果是:引用:10111213141516171819下面我們調試一下,看下編譯器如何實現:我們在fun函數的第一行設一個斷點。staticintn=i;所在行,按F5。按Alt+6打開Memory。按F10單步執(zhí)行,當p有值的時候,我

2、們將他的值拖到Memory窗口,這時就會轉到n所在的內存地址,可是這時static已經初始化了,我們不知道編譯器對他做了什么操作了。這時我們重新開始調試,一般n的內存地址不會變的,還是在那里。我這里以我這邊的地址為例:引用:0042E058000000000042E05C00000000/中間這個為n的內存地址0042E06000000000.我們按F10單步執(zhí)行一下一條語句(staticintn=i;)弓|用:0042E058010000000042E05C0A000000/n0042E06000000000.執(zhí)行完這條語句之后,除了n有了初值,上面有內存空間也有了變化。我們接著按F5直接執(zhí)

3、行到那個斷點處,再單步執(zhí)行一下,發(fā)現這次只是n的值有變化,所以我們猜測上面的那個位可能是static的標志位,如果是0的話,說明沒有初始化,如果是1的話,說明已經初始化了,下次再進來的時候就不用初始化了,為了驗證我們的猜測,我們現在在函數里面加幾句語言,修改那個值。引用:voidfun(inti)staticintn=i;int*p=&n;coutnendl;+n;/等下我們要在這寫代碼,讓staticintn/每次進這個函數都初始化一次-p;*p=0;/寫完上面二句,我們執(zhí)行一下,是不是發(fā)現執(zhí)行結果已經和上面的不同了,每次進函數都會對staticintn進行賦初值操作。下面我們再來看2個st

4、atic類型的情況,在上面的代碼中,我們再加一個static變量;引用:voidfun(inti)staticintn1=i;staticintn2=i;int*p=&n1;coutn1endl;+n1;/等下我們要在這寫代碼,讓staticintn/每次進這個函數都初始化一次-p;*p=0;/還是繼續(xù)調戲。二個static變量初始化之前內存里面的值引用:0042E050000000000042E054000000000042E058000000000042E05C00000000/n10042E06000000000/n20042E06400000000.當執(zhí)行完staticintn1=i;

5、語句之后,內存的值變成這樣了弓1用0042E058010000000042E05C0A0000000042E06000000000接著我們再單步執(zhí)行內存的值變成這樣。引用:0042E058030000000042E05C0A0000000042E0600A000000.這樣就很明顯了,編譯器分別用一位來表示一個static變量是否已經始化。上面是對于用變量對static進行初始化,對于用常量初始化的情況是怎么樣的呢?我們將上面的代碼改成:引用:#includevoidfun(inti)staticintn1=0 x12345678;int*p=&n1;cout*p0;-i)fun(i);ret

6、urn0;當指針取到值之后,我們結束調試。我這里的地址值是0 x0042ad64。好了,我們結束調戲,用winhex打開生成的可執(zhí)行文件,按Alt+g跳到n的地址,這里要減去0 x400000,也就是2ad64。是不是看到我們的初值了。因為inteI使用的是小端法,所以我們看到的值是反過來的。下面我們再來探索一下const的原理;下面看一個程序段引用:#incIudeintmain(void)constintn=1;int*p=(int*)&n;*p=0;coutnendI;cout*pendI;return0;我們執(zhí)行一下,結果是不是和我們所期望的不同呢,我們在第一行下斷點,一條一條的執(zhí)行。

7、確認每一步操作是否正確。7:coutnendl;0041161EpushoffsetILT+40(endl)(0040102d)00411623push100411625movecx,offsetcout(0042e070)0041162Acallostream:operator(004012a0)0041162Fmovecx,eax00411631callILT+30(ostream:operator)(008:cout*pendl;00411636pushoffsetILT+40(endl)(0040102d)0041163Bmovedx,dwordptrebp-80041163Emoveax,dwordptredx00411640pusheax00411641movecx,offsetcout(0042e070)00411646callostream:operator(004012a0)0041164Bmovecx,eax0041164DcallILT+30(ostream:operator)當執(zhí)行到*卩=0的時候我們發(fā)現n內存所在的值已經變成0了,但是為什么執(zhí)行結果令我們大失所望呢

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論