读书人

求教const限定符在C++中的实现原理解决

发布时间: 2012-04-16 16:20:04 作者: rapoo

求教const限定符在C++中的实现原理

C/C++ code
#include <iostream>using namespace std;int main(){ const int i = 8;int *pt = (int *) &i;*pt=5;cout<<*pt<<endl;cout<<i<<endl;system("pause");    return 0;}


[解决办法]
首先,const这个常量修饰是对于编写代码的程序员而言的,编译器通过类型检测等编译期手段来控制常量不能被改变。作为静态编译语言,C++代码编译成程序之后在运行时不可能控制某个地址只能读不能写
明白了这一点,就知道为什么*pt=5可以执行了,因为虽然pt这个指针指向一个常量的地址,但是常量的地址和变量的地址都是地址,在程序运行的时候是没有区别的

其次,编译器在优化的时候,会在遵守C/C++标准的前提下进行很多改动。
例如,一个变量如果被连续使用(一直在CPU寄存器内),那么除非声明“这个变量可能因为外因而改变”,否则CPU只读取这个变量到内部寄存器一次,而不是每次使用都重新读取
例如,常量折叠,在编译的时候就把所有使用这个常量的地方都直接替换为这个常量的初始化值

你在int *pt = (int *) &i这个地方,将一个指向常量的指针强行转换为一个指向变量的指针,因为你使用了显式强制转换,所以编译器许可了你的行为——但这并不代表你的行为就是合理的,只代表编译器同意“你有意做一些危险的事情,后果由你自己负责”
除非你很清楚这里面发生的每一步并且确实必要,否则不要写这样的代码。

读书人网 >C++

热点推荐