Вопрос по c++ – Получение одного и того же значения переменной const даже после его изменения с помощью const_cast

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, и изменение ее значения - это «неопределенное поведение». Мне любопытно узнать: это какой-нибудь механизм оптимизации компилятора, который "компилятор заменяет переменную в программе значением"? Это означает, что оператор 1 интерпретируется компилятором как:

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

Даже если заявление

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

заменяется

 ptr=(int*)(&i);

Я получаю тот же вывод:http://ideone.com/5lzJA

Оптимизацию обычно называют «постоянным распространением». Компилятору разрешено делатьanything это нравится, пока наблюдаемое поведение является правильным. Поведение не определено, поэтому компилятор автоматически исправляет все, что он делает. Flexo♦
Если вы хотите знать, что сделал компилятор, просто посмотрите, что сделал компилятор (то есть сгенерированный код). R. Martinho Fernandes
Я думаю, что отрицательные голоса являются суровыми James

Ваш Ответ

5   ответов
1

Это не оптимизация. Оптимизация - это преобразование программы в другую программу, которая имеет такое же поведение, но использует меньше ресурсов. Ваша программа не имеет определенного поведения, так что вы не можете применить к ней любое преобразование, которое приводит к тому же поведению.

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 сообщает компилятору, что идентификатор может быть изменен (если не этим кодом, то кем-то другим, поэтому не выполняйте никакой оптимизации)

2

Is it any compiler optimization mechanism that compiler replaces the variable in the program with the value?

Да; вот почему вы не видите изменения стоимости. Поведение пытается изменитьconst объект оставлен неопределенным, чтобы позволить такую оптимизацию (а также позволить помещать объекты в неписываемую память).

0

i could храниться в защищенной области памяти дляptr указать на. Конечно, может быть что угодно, вот почемуundefined - это в основном означает, что не зависит от какого-либо конкретного поведения, возникающего, если вы попытаетесь вызвать неопределенное поведение.

Насколько вам известно, это может привести к остановке сердца или к запуску лазерных лучей, но вы никогда не узнаете, потому что это ... (как это ...)undefined ;).

0

Скорее всего, поскольку это const int, компилятор оптимизирует и напрямую заменяет его значением i.

Похожие вопросы