Доступ к значению через результирующий указатель reinterpret_cast
является нарушением псевдонимов, если два типа действительно, вплоть до квалификации cv, отличаются не целыми типами char
, которые не являются unsigned
/ signed
версии друг друга. Поскольку вы сказали, что здесь есть два типа unsigned long
и unsigned long long
, это применимо к вашему делу.
Вы не можете использовать его, если хотите оставаться в рамках того, что определяет стандарт. Также нет способа набрать один целочисленный тип на другой, поэтому вам всегда нужно копировать (это может или не может быть оптимизировано компилятором).
Обычно вы можете сделать это работать на практике (даже если это неопределенное поведение в соответствии со стандартом) путем установки какого-либо флага компилятора, например -fno-strict-aliasing
, который указывает компилятору не оптимизировать на основе гарантий, данных ему правилом псевдонимов (что может привести к ухудшению производительности ) или «скрывая» доступ нарушающего указателя от оптимизатора, помещая его в другую единицу перевода (если оптимизация времени соединения не используется). Смотрите также комментарий @ HolyBlackCat по этому вопросу.
Либо будет непереносимым. Например, другой компилятор (версия) может по умолчанию оптимизировать время компоновки или не поддерживать -fno-strict-aliasing
или аналогичный.