C/C ++ Строгие псевдонимы, время жизни объекта и современные компиляторыC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 C/C ++ Строгие псевдонимы, время жизни объекта и современные компиляторы

Сообщение Anonymous »

Я сталкиваюсь с путаницей в отношении правила строгого аливации C ++ и его возможных последствий. Рассмотрим следующий код:
< /p>

Код: Выделить всё

int main() {
int32_t a = 5;
float* f = (float*)(&a);
*f = 1.0f;

int32_t b = a;   // Probably not well-defined?
float g = *f;    // What about this?
}
< /code>

Просмотр спецификации C ++, раздел 3.10.10, технически ни один из данных кодов, кажется, не нарушает «псевдонимы», указанные там: < /p>


Если программа пытается получить доступ к сохраненному значению объекта через LVALUE, отличного от одного из следующих типов, поведение не определено:

... список квалифицированных типов доклада ... < /p>
< /blockquote>


[*]*f = 1.0f;
не нарушает правила, потому что нет доступа к сохраненному значению , то есть я просто пишу в память через указатель. Я не читаю по памяти и не пытаюсь интерпретировать значение здесь.
Строка int32_t b = a; не нарушаю правила, потому что я получаю доступ через его оригинал введите. br />
В другом потоке член Cortammon фактически делает той же точки в ответе и добавляя, что любое возможное неопределенное поведение, возникающее в результате записей к Alive Objects < /em>, как в *f = 1.0F; < /code>, будет учитываться по определению стандарта «Срок службы объекта» (которые кажутся тривиальными для типов стручков).
< /p>

< P> однако: в Интернете есть много доказательств того, что вышеупомянутый код будет производить UB на современных компиляторах. См. Здесь и здесь, например.

Аргументация в большинстве случаев заключается в том, что компилятор может свободно рассмотреть и < /code> и f < /code> как не псевдонижая друг друга и, следовательно, свободно перенести инструкции .
< /p>

Большой вопрос теперь заключается в том, что такое поведение компилятора фактически будет «чрезмерной интерпретацией» стандарта.

Единственный раз, когда стандартный рассказывает о «псевдониме», в частности, находится в сноске до 3.10.10, где ясно, что это правила, которые должны регулировать псевдоним.

Как я упоминал ранее, я не вижу Любой из вышеперечисленного кода, нарушающий стандарт, но он может быть незаконным для большого числа людей (и, возможно, компилятора).
< /p>

Я хотел бы Очень ценю здесь некоторые разъяснения. Не совпадает с float на некоторых платформах, чтобы данное код могло бы нарушать правило «хранения достаточного выравнивания и размера». Я хотел бы указать, что int32_t был выбран намеренно, чтобы выровнять с float на большинстве платформ и что предположение для этого вопроса заключается в том, что типы действительно выровняются.


Небольшое обновление #2:

Как указали несколько участников, строка int32_t b = a; < /code>, вероятно, нарушает стандарт, хотя не с абсолютной уверенностью. Я согласен с этой точкой зрения и, не изменяя ни одного аспекта вопроса, попросите читателей исключить эту строку из моего заявления выше, что ни один из Кодекса не нарушает стандарт.

Подробнее здесь: https://stackoverflow.com/questions/186 ... -compilers
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»