读了李羽同学的《我对const修饰符应用的理解》,觉得还应该有所深入,于是就写了这个笔记。
以下是dave的理解:
const关键字在C语言中的作用仅仅是限定 不可以通过const变量来修改内存数据,但是可以通过别的方式,例如指针指向const变量然后再修改内存中的值。
但对于const关键字的优化gcc和g++的处理还有些不一样(以下对C/C++的描述可缩小范围为gcc/g++的描述)。
例如以下代码:
- #include <stdio.h>
- int main()
- {
- const int a = 100;
- int *p = (int *)&a;
- (*p)=1;
- printf(“%d”,a);
- return 0;
- }
在gcc下编译运行通过,输出1。
在g++下编译运行通过,输出100。调试过程中发现在printf(“%d”,a);这句的时候没有从内存中读取a的值,而是直接用100这个字面常量。这就是const关键字优化的结果,如果定义的时候换成volatile const int a = 100; 用volatile关键字限定的话就输出的1。
但是使用O2开关优化的时候,采用gcc/g++ (GCC) 3.4.5 (mingw-vista special)时 ,无论gcc还是g++都是输出100,加了volatile关键字也不起作用了。在gcc/g++ (GCC) 4.3.2 20081105 (Red Hat 4.3.2-7)中只要加入volatile,输出就是1。看来不同版本的编译器,不同的系统还有不一致的情况。所以这个结果提醒我们,不要试图修改const变量值,保不准会出现什么问题。
[大笑]
过来学点东西 呵呵
学习下
虽然不能修改,不过这种思路不错
可以用到其它方面
<div class="quote"><span class="q"><b>夜无眠(Net学生)</b>: 虽然不能修改,不过这种思路不错
可以用到其它方面</span></div>这位仁兄有什么奇思妙想,可以用到什么地方?也许可以crack一些东西
<div class="quote"><span class="q"><b>Kingsoft Information davelv(C/C++学生)</b>: 这位仁兄有什么奇思妙想,可以用到什么地方?也许可以crack一些东西</span></div>不是啊,我还是个小菜鸟呢,不过前几天看到一个关于友元类和虚函数在一起的时候可以通过指针欺骗编译器,现在又看到用指针进行欺骗,你们都厉害,以后还要多向你们学习呢
才女![惊讶]