Еще раз: строгое правило алиасинга и символ *

Чем больше я читаю, тем больше путаюсь.

Последний вопрос из связанных ближе всего подходит к моему вопросу, но я запутался со всеми словами о времени жизни объекта и особенно - нормально ли это только читать или нет.

Чтобы перейти прямо к делу. Поправьте меня если я ошибаюсь.

Это нормально, 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 ++) будет очень признателен. Я не мог найти что-либо о правилах псевдонимов или что-нибудь релевантное.

Ответы на вопрос(0)

Ваш ответ на вопрос