< /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
Мобильная версия