• <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
            香港aa三级久久三级| 亚洲中文字幕无码一久久区| 人人狠狠综合久久亚洲婷婷| 亚洲午夜久久久精品影院| 青青草原综合久久大伊人导航| 思思久久精品在热线热| 97久久精品无码一区二区 | 精品久久久久久久| 久久久WWW成人| 国产成人久久AV免费| 日韩人妻无码一区二区三区久久99 | 国产精品久久久久久福利漫画| 久久久久国产精品麻豆AR影院| 久久夜色精品国产噜噜亚洲AV| 国产精品久久久久久久午夜片| 久久久一本精品99久久精品88| 亚洲午夜精品久久久久久浪潮| 精品久久久久久亚洲| 久久婷婷成人综合色综合| 亚洲午夜无码久久久久小说| 精品999久久久久久中文字幕| 天天爽天天狠久久久综合麻豆| 久久国产精品无码网站| 亚洲国产精品一区二区久久| 麻豆成人久久精品二区三区免费| 一本大道久久香蕉成人网| 国产精品美女久久久久av爽 | 日本人妻丰满熟妇久久久久久| 亚洲欧美日韩久久精品| 手机看片久久高清国产日韩| 久久高潮一级毛片免费| 99久久婷婷国产综合精品草原| .精品久久久麻豆国产精品 | 久久久久免费视频| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区| 一本久道久久综合狠狠爱| 色综合久久夜色精品国产| 久久婷婷五月综合国产尤物app | 青青草原综合久久大伊人导航 | 亚洲精品无码久久久影院相关影片| 久久亚洲AV成人无码|