编译器在处理const变量跟一般变量时的区别
const變量,也就是常量,當某個變量加上const屬性的時候,表明這個變量不可修改。
?
const變量是不可寫的,那么我們對于const變量的處理只剩下讀操作了。
?
當我們讀一般的變量的時候,會先獲取該變量的地址,然后到該地址去取數據,那么對于const變量的讀操作是怎么樣的呢。
下面代碼有助于更好理解const變量:
?
#include<iostream> using namespace std;int main(){const int a=10;const int * p=&a; //讓指針p指向常量a所在的內存int * p_var=const_cast<int *>(p); //強制轉換const指針為非const*p_var=20; //往該指針所指向的內存寫20,也就是把10給覆蓋了cout<<a<<endl;cout<<(&a)<<endl;cout<<*p<<endl;cout<<(p)<<endl;cout<<*p_var<<endl;cout<<(p_var)<<endl;return 0; }?
?
然后看看輸出結果:
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 24 04 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;
?
********************************************************************************************
轉自:https://blog.csdn.net/blogofshuguang/article/details/16852241
我們都知道在程序中用const,如果是變量,這表示該變量的值不能被修改,,,但是看下面一段C代碼:
注意在用C編譯,
?
[cpp] view plain copy
?
?
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
?
總結
以上是生活随笔為你收集整理的编译器在处理const变量跟一般变量时的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C 标准转换运算符const_cast
- 下一篇: const_cast的使用:添加或去掉c