154. Shaping C-like unions into memory segments
Let’s consider the C-like union from the following figure (the members of a C union share the same memory location (the member’s largest data type dictates the size of the memory location), so only one of the members has a value at any moment in time):
Figure 7.15: A C-like union
In Figure 7.15, we have a C-like union named product
to shape two members, price
(double
) and sku
(int
), while only one can have a value at any moment in time. We can shape a memory segment to fit this model as follows (arena
is an instance of Arena
):
MemorySegment segment = arena.allocate(
ValueLayout.JAVA_DOUBLE.byteSize(),
ValueLayout.JAVA_DOUBLE.byteAlignment());
Because double
needs 8 bytes and int
needs only 4 bytes, we choose ValueLayout.JAVA_DOUBLE
to shape the size of the memory segment. This way, the segment can accommodate a double
and an int
at the same offset.
Next, we can set the price
or the sku
and...