Я читал о строгом псевдониме довольно много в последнее время. Стандарты C / C ++ говорят, что следующий код является недопустимым (неопределенное поведение, чтобы быть правильным), так как компилятор может иметь значение a
, кэшированное где-то, и не признает, что ему нужно обновить значение при обновлении b
;
float *a;
...
int *b = reinterpret_cast<int*>(a);
*b = 1;
Стандарт также гласит, что char*
может иметь псевдонимы, поэтому (исправьте меня, если я ошибаюсь) компилятор перезагрузит все кэшированные значения всякий раз, когда будет сделан доступ для записи в переменную char*
. Таким образом, следующий код будет правильным:
float *a;
...
char *b = reinterpret_cast<char*>(a);
*b = 1;
Но как быть со случаями, когда указатели вообще не задействованы? Например, у меня есть следующий код, и GCC выдает мне предупреждения о строгом псевдониме.
float a = 2.4;
int32_t b = reinterpret_cast<int&>(a);
То, что я хочу сделать, это просто скопировать необработанное значение a
, поэтому строгий псевдоним не должен применяться. Здесь есть возможная проблема, или просто GCC слишком осторожен с этим?
EDIT
Я знаю, что есть решение, использующее memcpy , но это приводит к тому, что код становится намного менее читаемым, поэтому я бы не хотел использовать это решение.
EDIT2
int32_t b = *reinterpret_cast<int*>(&a);
также не работает.
решаемые
Кажется, это ошибка в GCC .