struct Vec
{
double x, y, z;
};
Vec vec;
vec.x = 1.0;
vec.y = 2.0;
vec.z = 3.0;
double res = (&vec.x)[2]; // (&vec.x)[2] should be equal to vec.z
Значения переменной Реза должна быть равно 3. Но когда я включаю оптимизации на компилятор реорганизует инструкцию неправильно и разрешения содержит некоторый мусор. Некоторые возможные варианты переупорядочения:Компилятор инструкции переназначения
vec.x = 1.0;
vec.y = 2.0;
vec.z = 3.0;
res = (&vec.x)[2]; // correct value
vec.x = 1.0;
vec.y = 2.0;
res = (&vec.x)[2]; // incorrect value
vec.z = 3.0;
vec.x = 1.0;
res = (&vec.x)[2]; // incorrect value
vec.y = 2.0;
vec.z = 3.0;
Это ошибка в компиляторе? Или не разрешается доступ к элементам данных структуры, подобным этому?
EDIT:
Я просто понял, что предыдущий код на самом деле работает, извините за это. Но это не работает:
Vec vec;
vec.x = 1.0;
vec.y = 2.0;
vec.z = 3.0;
double res = (&vec.x)[i]; // (&vec.x)[i] should be equal to vec.z when i == 2
Когда переменная я не знаю, во время компиляции, компилятор реорганизует инструкции неправильно.
@BatCoder: Если это неопределенное поведение, не имеет значения, можете ли вы его воспроизвести или нет. –
Хэйверс, что значит '(& vec.x) [2]', как вы это понимаете? – osgx
(& vec.x) [2] получает адрес vec.x, добавляет 2 и разыскивает его. Он должен вернуть значение vec.z –