C# · 12月 19, 2021

C和C++中const的实现

博客推荐

https://blog.csdn.net/syzcch/article/details/8182184

博客中的三个案例很好

分析

const的功能呢由编译器实现,C++的编译器通常不为普通const常量分配储存空间,而是将他们保存在符号表中,这使得它成为一个编译期间的常量,没有了储存与读内存的操作,使得它的效率也很高。

在C语言中const表示只读的变量,既然把const看成是变量,那么其在内存中就会有储存他的空间,并且可以通过指针间接的改变该内存空间的值,当通过指针p改变该内存的值后,再获取i的值的时候,会访问该空间,得到的是被改变后的值。而C++把const看做常量,编译器会使用常数直接替换掉对i的引用,例如cout<<i;会理解成cout<<10;并不会去访问i的内存地址去取数据,这里有点像是C语言里的宏# define 10。因此C++里的i会输出10,而*p会输出20。

C++语言中只是对于内置数据结构做常数替换,而对于像结构体这样的非内置数据类型则不会。因为结构体类型不是内置数据类型,编译器不知道如何直接替换,因此必须要访问内存去取数据,而访问内存去取数据必然会取到被指针p改变后的值,因此会造成与C++中const int 类型完全不一样的处理模式。