編譯器在處理const變數跟一般變數時的區別

2022-04-03 10:06:25 字數 952 閱讀 3776

const變數,也就是常量,當某個變數加上const屬性的時候,表明這個變數不可修改。

const變數是不可寫的,那麼我們對於const變數的處理只剩下讀操作了。

當我們讀一般的變數的時候,會先獲取該變數的位址,然後到該位址去取資料,那麼對於const變數的讀操作是怎麼樣的呢。

下面**有助於更好理解const變數:

#includeusing

namespace

std;

intmain()

然後看看輸出結果:

10        //a             

0x28ac54    //&a            

20        //*p           

0x28ac54    //p              

20        //*p_var     

0x28ac54    //p_var        

輸出結果顯示&a,p,p_var 相同,不過a =10  , *p=*p_var=20,

乙個記憶體位址怎麼可能得到兩個不同的值?

看看反彙編:

4011d6:    c7 44

2404 0a 00

00 movl $0xa,0x4(%esp)

上面的就是讀取const a的值的彙編**,它不是從內訪問資料出來,而是直接得到常數0xa,也就是把const 變數當作真正的常量處理。

因此可以得到的結論就是:

對於const變數,編譯器會在編譯之前做處理,在所有要讀取該const變數的地方,把該const變數替換成他一開始就制定的常量,如

const int a = 10;

int b= a ;

會在編譯之前替換const變數,變成:

const int a = 10;

int b= 10;

編譯器在處理const變數跟一般變數時的區別

const變數,也就是常量,當某個變數加上const屬性的時候,表明這個變數不可修改。const變數是不可寫的,那麼我們對於const變數的處理只剩下讀操作了。當我們讀一般的變數的時候,會先獲取該變數的位址,然後到該位址去取資料,那麼對於const變數的讀操作是怎麼樣的呢。下面 有助於更好理解con...

編譯器處理相關

一.預處理器 編譯器 彙編器 鏈結器 預處理器會處理相關的預處理指令,一般是以 開頭的指令。如 include xx.h define等。編譯器把對應的 cpp翻譯成 s檔案 組合語言 彙編器則處理 s生成對應的 o檔案 obj目標檔案 最後鏈結器把所有的 o檔案鏈結成乙個可執行檔案 exe 1.部...

編譯器預處理實現

我們寫 一般都會寫一些注釋,為了讓人更好的理解 但是對於編譯器來說,這些注釋都需要去除,為了實現預處理,就是去除注釋 換行 回車等,我用dfa 確定有限自動機 來實現。include include using namespace std define r 10 define c 8 dfa int...