2

考虑下面的代码片段:

int main()
{
    const int i=3;
    int *ptr;

    ptr=const_cast<int*>(&i);
    *ptr=5;

    cout<<"i= "<<i<<endl;  <------------------- statement 1
    cout<<"*ptr= "<<*ptr<<endl;  <------------- statement 2

    return 0;
}

我得到的输出为:

i= 3
*ptr= 5

http://ideone.com/Bvme6

为什么i不通过指针改变值?

我知道抛弃显式声明为 const 的变量的 const 特性并修改其值是“未定义的行为”。我很想知道:'编译器用值替换程序中的变量'是否有任何编译器优化机制?这意味着语句 1 被编译器解释为:

cout<<"i= "<<3<<endl;

即使声明

ptr=const_cast<int*>(&i);    

被替换为

 ptr=(int*)(&i);

我得到相同的输出:http: //ideone.com/5lzJA

4

5 回答 5

2

编译器用值替换程序中的变量是否有任何编译器优化机制?

是的; 这就是为什么您看不到价值变化的原因。试图修改const对象的行为是未定义的,以便允许这样的优化(以及允许将对象放置在不可写的内存中)。

于 2012-07-27T15:19:58.713 回答
1

这不是优化。优化是将一个程序转换为另一个具有相同行为但使用较少资源的程序。您的程序没有任何已定义的行为,因此您不可能对其应用任何产生相同行为的转换。

于 2012-07-27T15:35:46.770 回答
0

很可能因为它是一个 const int,编译器正在优化并直接用 i 的值替换它。

于 2012-07-27T15:19:42.383 回答
0

i 可以存储在内存的受保护区域中以供ptr指向。当然,任何事情都可能是这种情况,这就是它未定义的原因- 这基本上意味着如果您确实尝试触发未定义的行为,则不要依赖于发生的任何特定行为。

据您所知,它可能会导致您的计算机进入心脏骤停或开始发射激光束,但您永远不知道,因为它是......(等待_等待_它)......未定义;)。

于 2012-07-27T15:25:42.987 回答
0

我有同样的问题,我添加了 volatile,现在它正在修改:

#include<iostream>
using namespace std;

int main()
{
  volatile const int a=5;
  int *p = const_cast<int*>(&a);
  *p=6;
  cout<<"a="<<a;
  return 0;
}

输出:

a=6

volatile 告诉编译器可以修改标识符(如果不是通过此代码,则由其他代码修改,因此不要执行任何优化)

于 2014-03-04T12:14:24.217 回答