Еще раз: строгое правило алиасинга и символ *
Чем больше я читаю, тем больше путаюсь.
Последний вопрос из связанных ближе всего подходит к моему вопросу, но я запутался со всеми словами о времени жизни объекта и особенно - нормально ли это только читать или нет.
Чтобы перейти прямо к делу. Поправьте меня если я ошибаюсь.
Это нормально, gcc не выдает предупреждение и я пытаюсь "прочитать типT
(uint32_t
) с помощьюchar*
«:
uint32_t num = 0x01020304;
char* buff = reinterpret_cast< char* >( &num );
Но это «плохо» (также выдает предупреждение), и я пытаюсь «наоборот»:
char buff[ 4 ] = { 0x1, 0x2, 0x3, 0x4 };
uint32_t num = *reinterpret_cast< uint32_t* >( buff );
Чем второй отличается от первого, особенно когда мы говорим о переупорядочении инструкций (для оптимизации)? Плюс добавлениеconst
не меняет ситуацию никак.
Или это просто прямое правило, которое четко гласит: «это можно сделать в одном направлении, но не в другом»? Я не смог найти ничего подходящего в стандартах (искал это особенно в стандарте C ++ 11).
Это то же самое для C и C ++ (как я читал комментарий, подразумевая, что это отличается для 2 языков)?
я использовалunion
«обойти» это, который до сих пор, кажется,НЕ 100% ОК, так как это не гарантируется стандартом (в котором говорится, что я могу полагаться только на значение, которое в последний раз изменялось вunion
).
Итак, после прочтениямногоЯ сейчас больше сбит с толку. Я думаю толькоmemcpy
такое "хорошее" решение?
Смежные вопросы:
Что такое строгое правило псевдонимов?предупреждение «Разыменование указателя типа будет нарушать правила строгого алиасинга»Правильно ли я понимаю строгий псевдоним C / C ++?Строгое правило псевдонимов и указатели 'char *'РЕДАКТИРОВАТЬ
Ситуация в реальном мире: у меня есть сторонний lib (http://www.fastcrypto.org/), который вычисляет UMAC и возвращает значение вchar[ 4 ]
, Затем мне нужно преобразовать это вuint32_t
, И, между прочим, библиотека использует такие вещи, как((UINT32 *)pc->nonce)[0] = ((UINT32 *)nonce)[0]
много. Тем не мение.
Также я спрашиваю о том, что правильно, а что неправильно и почему. Не только о переупорядочении, оптимизации и т. Д. (Что интересно с-O0
предупреждений нет, только с-O2
).
И пожалуйста, обратите вниманиеЯ знаю о ситуации с большим / маленьким порядком байтов. Это не тот случай, здесь. Я действительно хочу игнорировать порядок байтов здесь. «Строгие правила псевдонимов» звучат как нечто действительно серьезное, гораздо более серьезное, чем неправильный порядок байтов. Я имею в виду - как доступ / изменение памяти, которая не должна быть затронута;любой вроде UB вообще.
Цитаты из стандартов (C и C ++) будет очень признателен. Я не мог найти что-либо о правилах псевдонимов или что-нибудь релевантное.