Spec-Zone.ru › GNU Fortran 8

6.1.21 Объединение и отображение

Объединения — это старое расширение поставщика, которое часто использовалось с нестандартными расширениями СТРУКТУРА и ЗАПИСЬ. Использование UNION и MAP автоматически включается с -fdec-structure.

Декларация UNION происходит внутри структуры; внутри определения каждого объединения находится ряд блоков MAP. Каждое MAP разделяет память со своими отображениями-собратьями (в том же объединении), а размер объединения равен размеру самого большого отображения в нём, как и в объединениях языка C. Основное отличие заключается в том, что ссылки на компоненты не указывают, в каком объединении или отображении находится компонент (компилятор определяет это).

Вот небольшой пример:

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!'

Два отображения совмещают память, и размер объединения в конечном итоге составляет шесть байт:

0    1    2    3    4   5   6     Byte offset
-------------------------------
|    |    |    |    |    |    |
-------------------------------

^    W0   ^    W1   ^    W2   ^
 \-------/ \-------/ \-------/

^             LONG            ^
 \---------------------------/

Ниже приведён пример, отражающий структуру регистра Intel x86_64:

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'

Далее: Варианты типов для целочисленных встроенных функций, Предыдущее: СТРУКТУРА и ЗАПИСЬ, Вверх: Реализованные в GNU Fortran расширения [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.4.0/gfortran/UNION-and-MAP.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API