攀升·Uranus


Something Different,Something New
数据加载中……

小谈const 熟练C/C++(二)

         const关键字可以说是用途广泛,从对变量的限定到对函数的限定,尤其是那个指向常量的指针(const int *p),指针常量(int * const p),指向常量的指针常量(const  int* const p)更让初学者摸不到头脑。这里我主要想描述下最近项目中关于const的一个问题。简单代码如下:

int main()
{
      const int a = 100;
      int* p = (int *)&a;
      *p = 200;
      printf("\n%x\t%d", p, *p);
      printf("\n%x\t%d", &a, a);
      return 0;
}

VC 6.0 运行结果:

12ff7c    200
12ff7c    100
我看了下跟踪到内存12ff7c里确实放着200,这让我百思不得其解。于是我用gcc version 3.2.2 20030222
 运行结果如下:
bfffdee4 200
bfffdee4 200

那么经过跟高手讨教得出:
      第二个PRINTF打印出的100不是当时a的内容,而是vc 6.0编译优化,看见const后,直接将100放在要打印的a的地方,类似于#define,所以输出的还是100。那么最好的是使用volatile const int a = 100,一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。所以。。。
      经过这个东西我看到了其实除了学习c++语言本身外,还是要了解一些编译器的基本信息,是不是应该开编译选项之类的值得我们去深思。
        

posted on 2007-10-11 21:09 攀升 阅读(1617) 评论(9)  编辑 收藏 引用 所属分类: C/C++

评论

# re: 小谈const 熟练C/C++(二)  回复  更多评论   

这样的用法没有什么意义 而且还容易造成误解
顶多说让我明白vc和gcc在一些优化上的不同而已
2007-10-11 21:52 | shaker(太子)

# re: 小谈const 熟练C/C++(二)  回复  更多评论   

呵呵,又长见识了
期待下次的更新。。。
每天都来。。。

# re: 小谈const 熟练C/C++(二)  回复  更多评论   

ClassType MemFunc const;
const 这样用,可以吗?
2007-10-11 22:39 | ide

# re: 小谈const 熟练C/C++(二)  回复  更多评论   

to shaker:

确实在具体程序中你可能不会用到,但是这有助于对const这个关键字的认知深度。
2007-10-11 23:14 | 攀升

# re: 小谈const 熟练C/C++(二)  回复  更多评论   

very good chapter.I admire your this kind of sprit.
2007-10-12 17:56 | gina

# re: 小谈const 熟练C/C++(二)  回复  更多评论   

不错,有时候这种东西会带来大麻烦。
2007-10-13 20:32 | flyman

# re: 小谈const 熟练C/C++(二)  回复  更多评论   

我记得某本书上说如果对const作取地址操作或用extern修饰,编译器就会分配空间,如果不做的话会直接放入符号表优化。
2007-11-09 08:18 | evan.yh

# re: 小谈const 熟练C/C++(二)  回复  更多评论   

用了volatile 在VC6还是输出100
2007-11-09 20:42 | abware

# re: 小谈const 熟练C/C++(二)  回复  更多评论   

如果是volatile const int a = 100这句放在MAIN函数外做为全局变量,VC 2005下会有问题,放在MAIN函数中则无问题。
2007-12-13 19:10 | GB

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理