UNION-and-MAP.html 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <!-- Copyright (C) 1999-2017 Free Software Foundation, Inc.
  4. Permission is granted to copy, distribute and/or modify this document
  5. under the terms of the GNU Free Documentation License, Version 1.3 or
  6. any later version published by the Free Software Foundation; with the
  7. Invariant Sections being "Funding Free Software", the Front-Cover
  8. Texts being (a) (see below), and with the Back-Cover Texts being (b)
  9. (see below). A copy of the license is included in the section entitled
  10. "GNU Free Documentation License".
  11. (a) The FSF's Front-Cover Text is:
  12. A GNU Manual
  13. (b) The FSF's Back-Cover Text is:
  14. You have freedom to copy and modify this GNU Manual, like GNU
  15. software. Copies published by the Free Software Foundation raise
  16. funds for GNU development. -->
  17. <!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
  18. <head>
  19. <title>The GNU Fortran Compiler: UNION and MAP</title>
  20. <meta name="description" content="The GNU Fortran Compiler: UNION and MAP">
  21. <meta name="keywords" content="The GNU Fortran Compiler: UNION and MAP">
  22. <meta name="resource-type" content="document">
  23. <meta name="distribution" content="global">
  24. <meta name="Generator" content="makeinfo">
  25. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  26. <link href="index.html#Top" rel="start" title="Top">
  27. <link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
  28. <link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
  29. <link href="Extensions-implemented-in-GNU-Fortran.html#Extensions-implemented-in-GNU-Fortran" rel="up" title="Extensions implemented in GNU Fortran">
  30. <link href="Type-variants-for-integer-intrinsics.html#Type-variants-for-integer-intrinsics" rel="next" title="Type variants for integer intrinsics">
  31. <link href="STRUCTURE-and-RECORD.html#STRUCTURE-and-RECORD" rel="prev" title="STRUCTURE and RECORD">
  32. <style type="text/css">
  33. <!--
  34. a.summary-letter {text-decoration: none}
  35. blockquote.smallquotation {font-size: smaller}
  36. div.display {margin-left: 3.2em}
  37. div.example {margin-left: 3.2em}
  38. div.indentedblock {margin-left: 3.2em}
  39. div.lisp {margin-left: 3.2em}
  40. div.smalldisplay {margin-left: 3.2em}
  41. div.smallexample {margin-left: 3.2em}
  42. div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
  43. div.smalllisp {margin-left: 3.2em}
  44. kbd {font-style:oblique}
  45. pre.display {font-family: inherit}
  46. pre.format {font-family: inherit}
  47. pre.menu-comment {font-family: serif}
  48. pre.menu-preformatted {font-family: serif}
  49. pre.smalldisplay {font-family: inherit; font-size: smaller}
  50. pre.smallexample {font-size: smaller}
  51. pre.smallformat {font-family: inherit; font-size: smaller}
  52. pre.smalllisp {font-size: smaller}
  53. span.nocodebreak {white-space:nowrap}
  54. span.nolinebreak {white-space:nowrap}
  55. span.roman {font-family:serif; font-weight:normal}
  56. span.sansserif {font-family:sans-serif; font-weight:normal}
  57. ul.no-bullet {list-style: none}
  58. -->
  59. </style>
  60. </head>
  61. <body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
  62. <a name="UNION-and-MAP"></a>
  63. <div class="header">
  64. <p>
  65. Next: <a href="Type-variants-for-integer-intrinsics.html#Type-variants-for-integer-intrinsics" accesskey="n" rel="next">Type variants for integer intrinsics</a>, Previous: <a href="STRUCTURE-and-RECORD.html#STRUCTURE-and-RECORD" accesskey="p" rel="prev">STRUCTURE and RECORD</a>, Up: <a href="Extensions-implemented-in-GNU-Fortran.html#Extensions-implemented-in-GNU-Fortran" accesskey="u" rel="up">Extensions implemented in GNU Fortran</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
  66. </div>
  67. <hr>
  68. <a name="UNION-and-MAP-1"></a>
  69. <h4 class="subsection">6.1.21 <code>UNION</code> and <code>MAP</code></h4>
  70. <a name="index-UNION"></a>
  71. <a name="index-MAP"></a>
  72. <p>Unions are an old vendor extension which were commonly used with the
  73. non-standard <a href="STRUCTURE-and-RECORD.html#STRUCTURE-and-RECORD">STRUCTURE and RECORD</a> extensions. Use of <code>UNION</code> and
  74. <code>MAP</code> is automatically enabled with <samp>-fdec-structure</samp>.
  75. </p>
  76. <p>A <code>UNION</code> declaration occurs within a structure; within the definition of
  77. each union is a number of <code>MAP</code> blocks. Each <code>MAP</code> shares storage
  78. with its sibling maps (in the same union), and the size of the union is the
  79. size of the largest map within it, just as with unions in C. The major
  80. difference is that component references do not indicate which union or map the
  81. component is in (the compiler gets to figure that out).
  82. </p>
  83. <p>Here is a small example:
  84. </p><div class="smallexample">
  85. <pre class="smallexample">structure /myunion/
  86. union
  87. map
  88. character(2) w0, w1, w2
  89. end map
  90. map
  91. character(6) long
  92. end map
  93. end union
  94. end structure
  95. record /myunion/ rec
  96. ! After this assignment...
  97. rec.long = 'hello!'
  98. ! The following is true:
  99. ! rec.w0 === 'he'
  100. ! rec.w1 === 'll'
  101. ! rec.w2 === 'o!'
  102. </pre></div>
  103. <p>The two maps share memory, and the size of the union is ultimately six bytes:
  104. </p>
  105. <div class="example">
  106. <pre class="example">0 1 2 3 4 5 6 Byte offset
  107. -------------------------------
  108. | | | | | | |
  109. -------------------------------
  110. ^ W0 ^ W1 ^ W2 ^
  111. \-------/ \-------/ \-------/
  112. ^ LONG ^
  113. \---------------------------/
  114. </pre></div>
  115. <p>Following is an example mirroring the layout of an Intel x86_64 register:
  116. </p>
  117. <div class="example">
  118. <pre class="example">structure /reg/
  119. union ! U0 ! rax
  120. map
  121. character(16) rx
  122. end map
  123. map
  124. character(8) rh ! rah
  125. union ! U1
  126. map
  127. character(8) rl ! ral
  128. end map
  129. map
  130. character(8) ex ! eax
  131. end map
  132. map
  133. character(4) eh ! eah
  134. union ! U2
  135. map
  136. character(4) el ! eal
  137. end map
  138. map
  139. character(4) x ! ax
  140. end map
  141. map
  142. character(2) h ! ah
  143. character(2) l ! al
  144. end map
  145. end union
  146. end map
  147. end union
  148. end map
  149. end union
  150. end structure
  151. record /reg/ a
  152. ! After this assignment...
  153. a.rx = 'AAAAAAAA.BBB.C.D'
  154. ! The following is true:
  155. a.rx === 'AAAAAAAA.BBB.C.D'
  156. a.rh === 'AAAAAAAA'
  157. a.rl === '.BBB.C.D'
  158. a.ex === '.BBB.C.D'
  159. a.eh === '.BBB'
  160. a.el === '.C.D'
  161. a.x === '.C.D'
  162. a.h === '.C'
  163. a.l === '.D'
  164. </pre></div>
  165. <hr>
  166. <div class="header">
  167. <p>
  168. Next: <a href="Type-variants-for-integer-intrinsics.html#Type-variants-for-integer-intrinsics" accesskey="n" rel="next">Type variants for integer intrinsics</a>, Previous: <a href="STRUCTURE-and-RECORD.html#STRUCTURE-and-RECORD" accesskey="p" rel="prev">STRUCTURE and RECORD</a>, Up: <a href="Extensions-implemented-in-GNU-Fortran.html#Extensions-implemented-in-GNU-Fortran" accesskey="u" rel="up">Extensions implemented in GNU Fortran</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
  169. </div>
  170. </body>
  171. </html>