6.1.23 Объединение и отображение
Объединения — это старое расширение поставщика, которое часто использовалось с нестандартными расширениями СТРУКТУРА и ЗАПИСЬ. Использование 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-10.2.0/gfortran/UNION-and-MAP.html