• <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>

            Benjamin

            靜以修身,儉以養(yǎng)德,非澹薄無以明志,非寧靜無以致遠(yuǎn)。
            隨筆 - 398, 文章 - 0, 評(píng)論 - 196, 引用 - 0
            數(shù)據(jù)加載中……

            兩個(gè)變量,一個(gè)地址

            偶然在CSDN的論壇上看到這樣的題目,代碼如下:
             const int a=3;
                int *p=(int*)&a; 
                *p=100; 
                printf("*p =%d,a = %d\n",*p,a);
            printf("p = %p,a = %p\n",p,&a);
            程序中p和a的地址一樣,可值不一樣,容易讓人產(chǎn)生錯(cuò)覺。有人說這樣做改變了常量a的值,調(diào)試跟蹤中發(fā)現(xiàn)a的值是100,可輸出的卻是3;還有人認(rèn)為是常量折疊的緣故。其實(shí)這兩種說法都是錯(cuò)誤的,沒抓住問題的本質(zhì)。在這個(gè)程序中,通過int *p=(int*)&a;這個(gè)語句,常量a和指針p的地址是一樣的,但是由于它們所屬的內(nèi)存區(qū)的不同,在棧區(qū)我們看到*p值是100,常量區(qū)的值是3.
            在C++中,常量確實(shí)不分配內(nèi)存,但是當(dāng)對(duì)常量取地址時(shí)就已經(jīng)分配了空間,常量是不可以改變的,但我們要記住的是:常量和常量的地址是兩個(gè)概念,常量不可以改變,但是常量的地址可以改變,所以說,改變了常量a的值,說法是不正確的;至于在調(diào)試中,發(fā)現(xiàn)a的值是100(VC編譯器的調(diào)試模式下的觀察窗口下,用鼠標(biāo)點(diǎn)到a的地址處),可輸出的是3,那是因?yàn)椋A縜和變量p是一個(gè)地址,但是卻分屬不同的內(nèi)存區(qū)域,a是常量區(qū),p是棧區(qū),我們觀察的地址在棧中,所以看到的值是100(其實(shí)是存儲(chǔ)在指針p指向的地址中的值100),可輸出a的值3,a的值并沒變;這里和常量折疊的關(guān)系不大,至少不是它的實(shí)質(zhì),如果把const去掉值就一樣了。
            值得注意是:這樣的代碼容易讓人產(chǎn)生錯(cuò)覺,如果再有內(nèi)存分配的話,很容易出問題,并不提倡這樣的代碼。一直一來認(rèn)為,C++很大,注重的是細(xì)節(jié),這里再次驗(yàn)證了這一點(diǎn)。

            posted on 2009-01-11 00:40 Benjamin 閱讀(849) 評(píng)論(3)  編輯 收藏 引用 所屬分類: C/C++

            評(píng)論

            # re: 兩個(gè)變量,一個(gè)地址  回復(fù)  更多評(píng)論   

            是因?yàn)楸粌?yōu)化了
            2009-01-11 01:21 | 陳梓瀚(vczh)

            # re: 兩個(gè)變量,一個(gè)地址  回復(fù)  更多評(píng)論   

            調(diào)試跟蹤一下
            2009-01-11 10:31 | Herb

            # re: 兩個(gè)變量,一個(gè)地址  回復(fù)  更多評(píng)論   

            我對(duì)一樓說的補(bǔ)充下,其實(shí)很簡(jiǎn)單,對(duì)于const對(duì)象,編譯器是會(huì)做優(yōu)化的,像內(nèi)建類型的數(shù)據(jù),比如int,float這些,編譯器會(huì)直接優(yōu)化成立即數(shù),舉個(gè)例子,現(xiàn)在有這么一條語句:
            const int const_value = 1113;
            int value = const_value;
            vc的匯編窗口中對(duì)應(yīng)的匯編代碼是這樣的:
            004113AE mov dword ptr [const_value],9
            004113B5 mov dword ptr [value],9
            可以看出來,雖然優(yōu)化了,但是,優(yōu)化的并不是const_value本身,const_value依然是分配了內(nèi)存的,真正被優(yōu)化的是對(duì)const_value的取值操作,可以從004113B5這條語句看出來,對(duì)const_value的取值被直接化成了一個(gè)立即數(shù)。
            所以這篇文章中的問題我們能清楚的解釋了,原因是:
            對(duì)于const的語言內(nèi)建類型數(shù)據(jù),其取值操作會(huì)被優(yōu)化成立即數(shù)訪問,而涉及到內(nèi)存讀寫的操作,則和其他的變量操作是一樣的。
            2009-01-11 16:47 | dophi
            青青青伊人色综合久久| 日韩久久久久中文字幕人妻| 亚洲国产欧美国产综合久久| …久久精品99久久香蕉国产| 热99re久久国超精品首页| 久久综合狠狠综合久久97色| 亚洲中文字幕无码久久精品1| Xx性欧美肥妇精品久久久久久| 午夜福利91久久福利| 久久99精品国产99久久6男男| 久久这里都是精品| 久久精品亚洲乱码伦伦中文| 久久天天躁狠狠躁夜夜不卡| 2021国产成人精品久久| 亚洲AV日韩精品久久久久久| 一本色道久久88综合日韩精品| .精品久久久麻豆国产精品| 久久妇女高潮几次MBA| 久久久久久久久久久免费精品| 久久精品中文字幕无码绿巨人| 亚洲国产成人乱码精品女人久久久不卡| 久久99精品久久久久子伦| 国产精品久久久久久久app| 久久成人国产精品一区二区| 国产69精品久久久久777| 久久久久久亚洲AV无码专区| 亚洲va久久久噜噜噜久久男同| 久久亚洲国产成人影院网站| 久久―日本道色综合久久| 久久不见久久见免费视频7| 久久人人爽人人爽人人片AV不| 亚洲精品国产综合久久一线| 婷婷久久综合九色综合绿巨人 | 三级三级久久三级久久| 久久不见久久见免费影院www日本| 国产精品永久久久久久久久久| 久久免费视频网站| 国产精品99久久久久久董美香| 久久精品国产精品亚洲| 性做久久久久久久久久久| 一级做a爰片久久毛片免费陪|