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

2021-08-20 00:25:49 字數 2114 閱讀 5974

**:

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,如果是變數,這表示該變數的值不能被修改,,,但是看下面一段c**:

注意在用c編譯,

[cpp]view plain

copy

#include 

#include 

int main()  

c編譯器中給出的結果是:a = 20; *p = 20 (a的值被修改了)

而用c++編譯上面的**:a = 10; *p = 20;

為什麼會醬紫呢?那就先從const在c和c++中的實現機制找答案。。。

在c中,const修飾的變數被認為是唯讀的變數,該變數肯定是在記憶體中有儲存空間,用指標p指向該塊記憶體,然後就能輕易的修改掉這塊記憶體對應的值;

但是在c++中難道就不能夠修改掉記憶體的值嗎?。。。理想是這樣,現在是c++編譯器起作用的時候了,在編譯階段,c++編譯器會用常量10去替換程式

中對a的引用,所以,根本就沒有改的機會嘛。.(c++中的const正常情況下是看成編譯期的常量,編譯器並不為const分配空間,只是在編譯的時候將期值儲存在名字表中,並在適當的時候折合在**中,如果加上關鍵字extern或者取const變數位址,則編譯器就要為const分配儲存空間.

)還有乙個要注意的地方:c++編譯器只能對內建資料型別(int , float...)做常數替換,而對於像結構體\類這樣的非內建資料型別編譯器不知道怎麼替換,所以就不替換,

這就和c語言一樣了,可以通過指標修改掉cosnt的值,

比如:[cpp]view plain

copy

#include 

using

namespace std;  

class test  

~test(){}  

};  

int main()  

編譯器在處理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...