Re: offsetof() без UB
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 24.03.25 21:45
Оценка: 1 (1) +1
Здравствуйте, LuciferSaratov, Вы писали:

LS>Согласно стандарту это UB, но ведь есть законы, а есть правоприменительная практика.


UB это исключительно в том смысле, что, если Ваши программы вдруг попадут на такие реализации языка, где поля структуры/класса не располагаются смежно на участке адресуемой памяти, а хранятся не пойми где и не пойми как, то использование offsetof (хоть стандартного, хоть собственных аналогов) может привести к неожиданным результатам. А если язык реализован на традиционной архитектуре с адресуемой памятью, то никаких причин для неожиданностей не просматривается. Ну, кроме явной неадекватности разработчиков, ежели те упрутся в стиле "а вот нам приспичило, чтоб offsetof глючил, ибо по документации имеем право".

LS>целевые компиляторы это современный MSVC и clang под x86_64 и ARM


MS, слава богу, демонстрирует в отношении VC++ изрядную вменяемость, понимая, что поломка любого из традиционно используемых механизмов вызовет чрезмерные потрясения, в том числе и у них самих. Если они вносят в компилятор что-то новое, то всегда оставляют режимы для совместимости. Разработчики же относительно новых компиляторов такой ответственностью не обременены, зато имеют тенденцию пиариться за счет реализации новых модных фич. Но даже там потребуется нечто экстраординарное, чтоб поломать столь простое преобразование. И даже в этом случае остается возможность вычислять смещения во время работы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.