Field
 
Определяет выравнивание полей.

Синтаксис

Type typename Field = { 1 | 2 | 4 }
...
End Type

Описание

Field может быть использована для упаковки Types или Unions более плотно, чем по умолчанию. Наиболее часто используемым значением является Field = 1, что приводит Type или Union к плотной упаковке, как только возможно, без добавления байт между полями или в конце Type. Field может быть использован только для уменьшения выравнивания поле, но не может быть использован для его увеличения. Для того, чтобы добавить байты заполнения, Union с соответствующими элементами могут быть использованы.

Компоновка по умолчанию Type и Union структур в FreeBASIC следует GCC ABI. Это дает совместимость с другими компиляторами или языками такими как C.

По умолчанию поля выравниваются соответствуют их естественным границам, которые являются:
    • Кратно 1 для 1-байтовых типов данных
    • Кратно 2 для 2-байтовых типов данных
    • Кратна 4 для 4-байтовых типов данных
    • Кратна 4 для 8-байтовых типов данных (Linux & другие не-Win32 системы только)
    • Кратна 8 для 8-байтовых типов данных (Win32 только)
    • Огромные границы для Type/Union типов данных
Дескрипторы динамических строк обрабатываются как структуры Type с полями данных указателей,  имеют огромные выравнивания.
Строки фиксированной длины выровнены согласно выравниванию для размера символа.
Статические массивы выровнены согласно выравниванию для элемента типа данных.

Компилятор выравнивает поля, вставив байты заполнения перед ними для того, чтобы переместить их смещение, которое соответствует их естественной границе, или кратно значению с Field, если это меньше, чем естественное выравнивание поля. На архитектуре x86 такие выравнивания не требуется, но могут привести к лучшей производительности при доступе к полям. Другие архитектуры могут требовать надлежащего выравнивания.

Кроме того весь размер структуры округляется до нескольких крупнейших естественных выравниваний его полей, путем добавления байтов заполнения в конце структуры. Это гарантирует, что в массиве Type, каждый индивидуальный элемент правильно выровнен в соответствии с полем.


Пример

Type bitmap_header Field = 1
    bfType          As UShort
    bfsize          As UInteger
    bfReserved1     As UShort
    bfReserved2     As UShort
    bfOffBits       As UInteger
    biSize          As UInteger
    biWidth         As UInteger
    biHeight        As UInteger
    biPlanes        As UShort
    biBitCount      As UShort
    biCompression   As UInteger
    biSizeImage     As UInteger
    biXPelsPerMeter As UInteger
    biYPelsPerMeter As UInteger
    biClrUsed       As UInteger
    biClrImportant  As UInteger
End Type

Dim bmp_header As bitmap_header

'Открыть bmp.bmp и получить его данные заголовка:
'Примечание: Не будет работать без bmp.bmp для загрузки . . .
Open "bmp.bmp" For Binary As #1

    Get #1, , bmp_header
    
Close #1

Print bmp_header.biWidth, bmp_header.biHeight

Sleep



Различия диалектов

  • В диалекте -lang qb, компилятор предполагает Field = 1 по умолчанию, Если нет других указанных Field, структуры плотно упакованы, без добавления поля, как в QB.

Отличия от QB

  • В QB Field был использован для определения полей в файловом буфере во время выполнения. Эта функция не реализована в FB, поэтому ключевое слово было пересмотрено. Для определения поля в файловом буфере, Type необходимо использовать.

См. также