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
",a);//在C语言中,a变成了20,而在C++中,a依然是10
13     return 0;
14 }

2.const与宏定义的区别

    const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。
    const常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
    另外,编译器通常不为const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。


  
 
  
 

原文地址:https://www.cnblogs.com/jswu-ustc/p/8532311.html