C++, вопрос про безопасность offsetof

124
14 августа 2021, 14:30

Я бы хотел прояснить следующий момент.

По Стандартам C и C++ разыменование указателя, который содержит адрес с неверным для данного типа выравниванием, - есть неопределенное поведение.

Более того, даже запись в указатель адреса с неверным выравниванием - тоже неопределенное поведение.

Благословенный способ получения данных, чье выравнивание больше единицы (int, float и пр.), из невыровненного расположения, - это использование memcpy(). Этот способ устраняет из кода неопределенное поведение, а вызов функции компилятор заменяет на прямое помещение в регистр, если это возможно.

Я не понял одного - каков безопасный способ получить величину смещения для заданного поля?

Мне известно про существование offsetof(). И этот способ гарантированно был бы безопасен, если бы это была buildin функция, но в моем компиляторе это не так.

Как видно из кода, этот макрос содержит разыменование нулевого указателя. Как компилятор это учитывает и учитывает ли? Или это костыль, на надежность которого полагаться не стоит?

Answer 1

Я не понял одного - каков безопасный способ получить величину смещения для заданного поля?

Возьмите готовый объект данного типа и вычисляйте на здоровье. При наличии готового объекта, вам не придется заниматься работой с невалидными указателями. Это неудобно, но формально является безопасным способом.

Как видно из кода, этот макрос содержит разыменование нулевого указателя.

Реализация offsetof находится внутри реализации стандартной библиотеки. Правила языков С и С++ на эту территории не распространяются. Это вообще не С и не С++. Разглядывать реализацию offsetof с точки зрения требований C++ - бессмысленное занятие.

READ ALSO
Почему-то не создается окно в ImGui

Почему-то не создается окно в ImGui

Почему-то не создается окноЯ новичок в ImGui

145
Развернуть свернутое окно

Развернуть свернутое окно

Как можно средствами C++ развернуть свернутую программу и сделать её окно активным?

91
C++ и ссылки &&

C++ и ссылки &&

Я бы хотел разобраться в том, для чего именно в Стандарт C++ были добавлены ссылки &&Какие именно проблемы решает это нововведение?

229