• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            小步慢跑

             

            編譯器對(duì)const的優(yōu)化

            下面是《DRE》這本書中討論const和define的差別時(shí)的一個(gè)小例子(vc6)

               1: #include <iostream>
               2: using namespace  std;
               3: void main()
               4: {
               5:     const int nConst = 5;
               6:  
               7:     int * pConst = (int*)&nConst;
               8:     *pConst = 6;
               9:  
              10:     int nVar = nConst;
              11:     cout <<"nConst: " <<nConst<<"  nVar:"<<nVar<<endl;
              12:     getchar();
              13: }

            本以為nConst的內(nèi)容已經(jīng)被修改為6了,最后 nVar和nConst都應(yīng)該是6,可是運(yùn)行的輸出都是 5。大為不解。先單步,發(fā)現(xiàn)在 執(zhí)行int nVar = nConst前,nConst的值確實(shí)是6,可是執(zhí)行后,nVar的值卻是5。這下更是不解了。再看反匯編:

               1: 5:        const int nConst = 5;
               2: 00401588   mov         dword ptr [ebp-4],5
               3: 6:
               4: 7:        int * pConst = (int*)&nConst;
               5: 0040158F   lea         eax,[ebp-4]
               6: 00401592   mov         dword ptr [ebp-8],eax
               7: 8:        *pConst = 6;
               8: 00401595   mov         ecx,dword ptr [ebp-8]
               9: 00401598   mov         dword ptr [ecx],6
              10: 9:
              11: 10:       int nVar = nConst;
              12: 0040159E   mov         dword ptr [ebp-0Ch],5
              13: 11:       cout <<"nConst: " <<nConst<<"  nVar:"<<nVar<<endl;

            可以看到 int nVar = nConst 這行對(duì)應(yīng)的匯編 是直接把 5 賦給了 nVar。cout<<時(shí)也是如此。

             

            《DRE》書中的解釋如下:“由于 const 修飾的變量 nConst 被賦值一個(gè)數(shù)字常量5,編譯器在編譯過程中發(fā)現(xiàn) nConst的初值是可知的,并且被修飾為const。之后所有使用nConst的地方都以這個(gè)可預(yù)知值替換,故 int nVar = nConst; 對(duì)應(yīng)的會(huì)變代碼沒有將nConst賦值給nVar,而是用常量5代替,如果nConst的值為一個(gè)未知值,那么編譯器將不會(huì)作此優(yōu)化”

            試著將上面的代碼修改如下,輸出就都是6 了

               1: #include <iostream>
               2: using namespace  std;
               3: void main()
               4: {
               5:     int nTemp = 5;
               6:     const int nConst = nTemp;
               7:  
               8:     int * pConst = (int*)&nConst;
               9:     *pConst = 6;
              10:  
              11:     int nVar = nConst;
              12:     cout <<"nConst: " <<nConst<<"  nVar:"<<nVar<<endl;
              13:     getchar();
              14: }

            posted on 2012-08-01 17:57 zaccheo 閱讀(728) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 內(nèi)功


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            隨筆分類(23)

            隨筆檔案(26)

            文章分類(1)

            文章檔案(1)

            csdn

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            国产精品视频久久久| 天天爽天天爽天天片a久久网| 久久福利青草精品资源站| 国产成人精品久久综合 | 久久亚洲AV无码西西人体| 亚洲国产综合久久天堂| 久久久久久毛片免费播放| 亚洲乱亚洲乱淫久久| 国产精品99久久久精品无码| 久久丫精品国产亚洲av| 无码国内精品久久人妻麻豆按摩| 亚洲AV无码一区东京热久久| 久久国产视频网| 四虎国产永久免费久久| 色诱久久av| 久久香蕉综合色一综合色88| 久久婷婷是五月综合色狠狠| 久久99热狠狠色精品一区| 久久99热这里只有精品国产| 99久久精品免费看国产一区二区三区 | 日日噜噜夜夜狠狠久久丁香五月 | 亚洲一区精品伊人久久伊人 | 久久久久无码中| 99re久久精品国产首页2020| 尹人香蕉久久99天天拍| 久久精品国产亚洲精品| 精品久久久久久无码专区| 久久精品国产亚洲AV影院| 亚洲欧洲久久av| 国内精品欧美久久精品| 99国产欧美久久久精品蜜芽 | 国产成人久久精品一区二区三区 | 午夜精品久久久久久毛片| 亚洲а∨天堂久久精品9966| 国产成人久久久精品二区三区| 国产精品9999久久久久| 久久久老熟女一区二区三区| 丁香色欲久久久久久综合网| 亚洲中文字幕久久精品无码喷水| 亚洲国产精品综合久久网络| 久久夜色精品国产www|