C++的常量摺疊--const和volatile

來源:互聯網
上載者:User

標籤:

背景知識

在開始之前先說一下符號表,這個編譯器中的東西。下面看一下百度百科中的描述:

符號表是一種用於語言翻譯器中的資料結構。在符號表中,程式原始碼中的每個標識符都和它的聲明或使用資訊綁定在一起,比如其資料類型、範圍以及記憶體位址。
符號表在編譯器工作的過程中不斷收集、記錄和使用來源程式中一些文法符號的類型和特徵等相關資訊。這些資訊一般以表格形式儲存於系統中。如常數表、變數名表、數組名表、過程名表、標號表等等,統稱為符號表。對於符號表組織、構造和管理方法的好壞會直接影響編譯系統的運行效率。

還有一個問題:前面說的似乎很讓人煩,既然聲明成了const,幹嘛還老修改啊?

根據C++標準,對於修改const變數,屬於:未定義行為(指行為不可預測的電腦代碼),這樣一來此行為取決於各種編譯器的具體實現(即不同編譯器可能表現不同)。

看到了吧,C++標準是不提倡這麼玩的。

 

下面看一下前面說的那個對照程式:

int main(){    int i0 = 11;    const int i = 0;         //定義常量i    int *j = (int *) &i;   //看到這裡能對i進行取值,判斷i必然後自己的記憶體空間    *j = 1;                  //對j指向的記憶體進行修改    printf("0x%p\n0x%p\n%d\n%d\n",&i,j,i,*j); //觀看實驗效果        const int ck = 9;     //這個對照實驗是為了觀察,對常量ck的引用時,會產生的效果    int ik = ck;    int i1 = 5;           //這個對照實驗是為了區別,對常量和變數的引用有什麼區別    int i2 = i1;    return 0;}

同時把i的聲明那條語句改成:

const volatile int i = 0;         //定義常量i

我們知道volatile是告訴編譯器在翻譯源碼到組合語言(機器碼)的過程中,不要最佳化。把源碼中對i的訪問,翻譯成每次都要去記憶體中抓取資料(這裡是在做編譯工作,只是把對應的源碼翻譯成組合語言),而不是從符號表(常量表)中抓取資料。所以加上volatile關鍵字的i的訪問都是去記憶體中拿資料,不去常量表中。

現在還有個問題,如果我加上volatile關鍵字,那麼每次對i的訪問的語句都被翻譯成了”去看記憶體裡的資料“這種行為的組合語言,不會有常量替換的過程了,那麼下面的語句是不是合法了呢?

i = 10;

你修改了常量的值,怎麼可能合法呢?但是按照上面的說法對於const volatile int類型的i似乎又是合法的。問題出在了這裡:

編譯器的一部分工作流程是這樣的:文法檢測->先行編譯(宏替換,常量替換,*(&i)恒等於i等最佳化)->編譯。所以i = 10這句話在語法檢查這個階段,看到你對一個const常量賦值,就已經報錯了,根本到不了編譯這個階段。

但是有的一些編譯器似乎無視這個volatile關鍵字,下面看一下測試的結果:

(1)看vc6.0的結果:

沒有volatile關鍵字的:

有volatile關鍵字的:

即在VC++6.0編譯環境下,在const變數定義時添加volatile修飾符,與不添加效果是一樣的。編譯器都採取了最佳化(甚至把編譯器最佳化選項關閉還是如此,無奈了)。

(2)vs2010和g++的測試結果是一樣的:

沒有volatile關鍵字:

有volatile關鍵字:

所以:不建議修改const變數的值,即使修改也要熟悉當前使用的編譯器對於該 未定義行為 是如何解釋的

C++的常量摺疊--const和volatile

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.