• <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)。
            隨筆 - 397, 文章 - 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 閱讀(837) 評(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
            麻豆精品久久久一区二区| yy6080久久| 欧美久久综合性欧美| 久久99精品久久久久久9蜜桃| 国产激情久久久久影院小草 | 三级韩国一区久久二区综合| 久久香综合精品久久伊人| 老色鬼久久亚洲AV综合| 日本久久久久久中文字幕| 国产精品一区二区久久精品涩爱| av午夜福利一片免费看久久| 无码8090精品久久一区| 久久久国产乱子伦精品作者| 国产精品无码久久久久| 亚洲日韩中文无码久久| 日本欧美国产精品第一页久久| 久久九九兔免费精品6| 久久久黄片| 91精品免费久久久久久久久| 国产精品久久久久久久人人看| 久久精品国产精品亚洲精品| 麻豆一区二区99久久久久| 久久热这里只有精品在线观看| 欧美激情精品久久久久| 99久久这里只有精品| 无码久久精品国产亚洲Av影片| 污污内射久久一区二区欧美日韩| 国产精品伦理久久久久久| 粉嫩小泬无遮挡久久久久久| 欧美大香线蕉线伊人久久| 久久狠狠爱亚洲综合影院| 亚洲人成无码久久电影网站| 久久久久国产一区二区三区| 久久综合综合久久狠狠狠97色88| 72种姿势欧美久久久久大黄蕉| 狠狠88综合久久久久综合网| 无码超乳爆乳中文字幕久久| 久久久无码人妻精品无码| 久久综合给合久久狠狠狠97色69 | 欧美一区二区三区久久综| 久久91精品国产91久|