zoukankan      html  css  js  c++  java
  • 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常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。


      
     
      
     

  • 相关阅读:
    日志管理工具logrotate
    springboot2整合logback.xml动态修改日志打印级别
    mybatis框架之装饰模式
    mybatis源码分析之06二级缓存
    后勤信息反馈---场景描述
    《人月神话》读后感---计算机产品的文档
    android studio 使用第三方模拟器连接方法
    第八周总结
    Android Studio 和 SDK 下载、安装和环境变量配置
    求最大子数组并单步显示
  • 原文地址:https://www.cnblogs.com/jswu-ustc/p/8532311.html
Copyright © 2011-2022 走看看