一个值得注意的const问题

注意留意类似的代码:

const double a = 5.f
double *p = const_cast<double*> (&a);
*p = 2.f;
const bool isEq = (&a == p);
printf("a = %f, *p = %f, isEq = %d\n", a , *p, isEq?1:0);

代码很简单, p 解const指向了a ,并且修改了a的值, isEq 是 true 代表p 确实指向的是a的地址, 但printf出来的值呢?

出乎意料的打印出来的却是:

a = 5.000000, *p = 2.000000, isEq = 1

难道p指向的a的地址,却没有改变它的值?

打印汇编出来看就能解释问题了

原来编译器在编译printf这段代码时,认为const的变量不会改变,直接用push $0x5 这么一句来代替了取a值


出现这种问题原因是编译器并不能正确的预知const_cast带来的改变, 从而自作聪明的优化了代码,同样问题出现在如果你用a 给其他double变量 赋值, 比如

double b = a; 这样一样的不会因为*p = 2.f;带来任何改变, b 任然是 5.000000

如果简单类型的变量会发生改变, 最好不要定义成const 的


猜你喜欢

转载自blog.csdn.net/evilswords/article/details/33725333