union
{
Uint32 Integer;
Float32 Real;
} Field;
I have to use that union for a little IEEE trick, does that break strict aliasing? GCC is no
Aliasing via a union is defined in C but has undefined behaviour in C++; the undefined behaviour is equivalent to that which occurs when reading from an uninitialized variable (a lvalue-to-rvalue conversion).
Accordingly, the most likely way this would break is in the optimiser deciding to eliminate the read from the union, as it does not have a defined value. However, most C-and-C++ compilers are likely to give you the C behaviour as they need to support that anyway.
The safe way to alias the values is via bytewise copy e.g. std::memcpy
or std::copy(reinterpret_cast<char *>(...), ...)
. Alternatively, if you can compile your project in both C and C++ you could move the union aliasing code to a C source file and compile just that code as C.
It is UB (but doesn't require strict aliasing). Also, union
d data is always stored in memory by implementations, AFAIK, else would require knowing which register the source data came from, which means knowing the source type.