Безопасная и эффективная подстановка типов в C ++

uint32_t Seed() {
    uint64_t seed = GetSomeReasonable64BitIntegerSeed();
    return *(uint32_t*)&seed ^ *((uint32_t*)&seed + 1);
}

Выше не настоящий код, но это в основном то, что делает настоящий код. Я получил предупреждение от g ++ о том, что он нарушает строгие псевдонимы, погуглил, и ладно, я хочу это исправить. Я нашел этот вопрос, но он не дает четкого решения, кроме используя memcpy, или полагаясь на неопределенное, но практически беспроблемное поведение, то есть на доступ к неустановленному члену объединения.

На данный момент я могу придумать следующие варианты:

  1. Используйте memcpy.
  2. Используйте union и скомпилируйте эту часть как C, где стандарт языка позволяет использовать каламбур с помощью объединений.

person xiver77    schedule 25.05.2015    source источник
comment
безопасный каламбур можно выполнить с помощью std::bit_cast. Но на самом деле это проблема XY, которая вообще не требует набора текста.   -  person phuclv    schedule 16.11.2020


Ответы (1)


Побитовая арифметика хорошо определена и, возможно, более эффективна. В этом примере:

return seed ^ (seed >> 32);
person Mike Seymour    schedule 25.05.2015