Memory position of elements in C/C++ union
In 6.7.2.1p16 the C standard guarantees that:
The size of a union is sufficient to contain the largest of its members. The value of at most one of the members can be stored in a union object at any time. A pointer to a union object, suitably converted, points to each of its members (or if a member is a bit- field, then to the unit in which it resides), and vice versa.
So, yes, you can rely on all members starting at the union
s address (note this is the same for the first member of a struct
).
The C++ standard includes a similar sentence with respect to C-style (i.e. only C-style members) union
s/struct
s, because C++ allows to pass union
s to C functions which does require this layout.The relevant section in the C++ standard is 9.5.
However, note there might be padding bits inside standard simple types (integers, floats). And their internal may vary (endianess). You also might violate strict aliasing rule (C: effective type).
From my experience, I would say 'yes', though I've checked the C++14 standard and it even guarantees this. (c++11 will most likely have the same effects) Chapter 9.5 states: All non-static data members of a union object have the same address
So, you can depend on this behavior.