首先來看一個例子: int main(int argc, char* argv[]) 結(jié)果是 0012ff7c 0 1 因為i和j都指向相同的內(nèi)存地址,所以輸出的前兩個結(jié)果是相同的,但為啥相同的內(nèi)存里的結(jié)果不相同么?--這就是常量折疊. 這個"常量折疊"是 就是在編譯器進行語法分析的時候,將常量表達式計算求值,并用求得的值來替換表達式,放入常量表??梢运阕饕环N編譯優(yōu)化。 因為編譯器在優(yōu)化的過程中,會把碰見的const全部以內(nèi)容替換掉(跟宏似的: #define pi 3.1415,用到pi時就用3.1415代替),這個出現(xiàn)在預編譯階段;但是在運行階段,它的內(nèi)存里存的東西確實改變了!!! 6.網(wǎng)上的一些問題(4) 關于常量 這些天被常量的一些概念折磨著,現(xiàn)在終于有些明白了, 問題始于const int i = 10;//i存在哪,10存在哪 說明一:符號表 這個語句是對i的聲明,因為編譯器一開始就知道i的值,所以以后出現(xiàn)i時就會用10代替,這好像叫做符號表的概念,i就對應10了。 網(wǎng)上一篇帖子上有這樣的代碼: const int a = 3; int *p = const_cast<int *>(&a); *p = 4; cout << a;//仍然輸出3 這個結(jié)果可以用上面的說明來解釋 說明二:常量折疊(const folding)與復寫傳播 (copy propagation) 網(wǎng)上人們普遍反映thinking in c++將const folding譯為常量折疊是種誤導,我覺得譯的還行,本來folding就有折疊的意思,就是把原來的東西變小,而象const int i = 2*2;編譯器確實將2*2算成4了,以后碰到i就用4替換,這個計算2*2的過程據(jù)說叫常量折疊--const folding,而用4替換i的過程叫做復寫傳播--copy propagation.他們都是編譯器的優(yōu)化技術(shù) 說明三:為常量分配空間 補充一下,這里說的都是const 定義的常量,而非文字常量, (c++ primer翻譯成文字常量--literal constant the c++ programming language(tcpl)翻譯成文字量,還分了不同類型) 至于文字常量存在哪,c++ primer 3ed上說它們是不可尋址的--nonaddressable,盡管它們也存在機器內(nèi)存某個地方,但無法訪問它們的地址 對于int double等類型還好理解,但是對于字符串常量(tcpl里說將字符串文字量作為常量,利于存儲與訪問時的優(yōu)化)下面的代碼似乎表示字符串常量存儲在靜態(tài)存儲區(qū)里(字符串文字量是靜態(tài)分配的--tcpl),那么字符串常量的地址不是可以訪問了嗎,在靜態(tài)存儲區(qū)里 http://bbs./dispbbs.asp?boardid=56&replyi... 字符串文字量的類型是常量字符數(shù)組--適當個數(shù)的const字符的數(shù)組 //有關字符常量的存儲區(qū)的問題 //另外,char a[]和char *a的區(qū)別 //"hello world 1"存在哪
6.總結(jié) 那么"常量折疊"到底是啥意思呢? 我理解,簡單的說就是,當編譯器處理const的時候,編譯器會將其變成一個立即數(shù)。 《thinking in c++》里面說這一點在數(shù)組定義里尤其重要(為啥呢?沒有查到相關的資料)。 |
|