Unions are an old vendor extension which were commonly used with the non-standard STRUCTURE and RECORD extensions. Use of UNION
and MAP
is automatically enabled with -fdec-structure
.
A UNION
declaration occurs within a structure; within the definition of each union is a number of MAP
blocks. Each MAP
shares storage with its sibling maps (in the same union), and the size of the union is the size of the largest map within it, just as with unions in C. The major difference is that component references do not indicate which union or map the component is in (the compiler gets to figure that out).
Here is a small example:
structure /myunion/ union map character(2) w0, w1, w2 end map map character(6) long end map end union end structure record /myunion/ rec ! After this assignment... rec.long = 'hello!' ! The following is true: ! rec.w0 === 'he' ! rec.w1 === 'll' ! rec.w2 === 'o!'
The two maps share memory, and the size of the union is ultimately six bytes:
0 1 2 3 4 5 6 Byte offset ------------------------------- | | | | | | | ------------------------------- ^ W0 ^ W1 ^ W2 ^ \-------/ \-------/ \-------/ ^ LONG ^ \---------------------------/
Following is an example mirroring the layout of an Intel x86_64 register:
structure /reg/ union ! U0 ! rax map character(16) rx end map map character(8) rh ! rah union ! U1 map character(8) rl ! ral end map map character(8) ex ! eax end map map character(4) eh ! eah union ! U2 map character(4) el ! eal end map map character(4) x ! ax end map map character(2) h ! ah character(2) l ! al end map end union end map end union end map end union end structure record /reg/ a ! After this assignment... a.rx = 'AAAAAAAA.BBB.C.D' ! The following is true: a.rx === 'AAAAAAAA.BBB.C.D' a.rh === 'AAAAAAAA' a.rl === '.BBB.C.D' a.ex === '.BBB.C.D' a.eh === '.BBB' a.el === '.C.D' a.x === '.C.D' a.h === '.C' a.l === '.D'
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.3.0/gfortran/UNION-and-MAP.html