Volatile не может помочь вам избежать неопределенного поведения здесь.
Что-нибудь относительно volatile
несколько неясно в стандарте. Я в основном согласился с вашим ответом, но теперь я хотел бы немного не согласиться.
Чтобы понять, что означает volatile
, стандарт не понятен большинству людей, особенно некоторым авторам компиляторов. Лучше подумать
при использовании volatile
(и только когда) C / C ++ в значительной степени является сборкой высокого уровня .
При записи в volatile
lvalue компилятор выдаст STORE или множественный STORE, если одного недостаточно (volatile
не подразумевает атомарный).
При записи в volatile
lvalue компилятор выдаст ЗАГРУЗКУ или многократную ЗАГРУЗКУ, если ее недостаточно.
Конечно, там, где нет явных LOAD или STORE, компилятор просто выдаст инструкции, которые подразумевают LOAD или STORE.
Sellibitze дал лучшее решение: используйте memcpy
для реинтерпретации битов.
Но если все обращения к области памяти осуществляются с volatile
lvalues, совершенно ясно, что строгие правила псевдонимов не применяются . Это ответ на ваш вопрос.