c++中的const关键字
1.const的符号表机制探究
c语言中的const是一个冒牌货,c++中的const才是一个真正的常量。原因分析:c语言中的const将重新分配一块内存空间。c++编译器对const关键字做了特殊处理,将const常量放到符号表中。
例如:p = (int *)&a;对a变量取地址,C++编译器会为a再单独的开辟一块儿内存空间,p就是指向了这块儿内存空间,无论怎么改,也改变不了符号表中对应的值 ,而当调用a的时候,还是会在符号表中取值,所以做到了真正的不变 。而C语言中只是给常量申请了块儿内存空间, 所以,C++中可以说是将const变成了真正的const。
1 //下面做举例说明 2 3 #include <stdio.h> 4 int main(){ 5 //看起来好像a是一个常量,其实不然 6 const int a = 10; 7 //a = 11; 8 int *p = NULL; 9 p = (int *)&a; 10 11 *p = 20; //间接赋值 12 printf("a:%d\n",a);//在C语言中,a变成了20,而在C++中,a依然是10 13 return 0; 14 }
2.const与宏定义的区别
const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。
const常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
另外,编译器通常不为const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。