注意留意类似的代码:
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 的
扫描二维码关注公众号,回复:
5527019 查看本文章