Referenz - FIELD
Syntax: TYPE UDTName FIELD = { 1 | 2 | 4 }
Typ: Schlüsselwort
Kategorie: Speicher
FIELD wird zusammen mit TYPE und UNION verwendet und legt dort das Padding-Verhalten fest. Dieses bestimmt, dass UDTs auf eine bestimmte Länge "ausgedehnt" werden sollen. Der Zweck liegt darin, dass auf solche ausgedehnten Felder z. T. schneller zugegriffen werden kann. Das Feld wird dabei so ausgedehnt, dass die Anzahl der Bytes, die das Feld im Speicher benötigt, ein ganzzahliges Vielfaches von 1, 2 oder 4 ist.
FIELD hat nur eine Auswirkung, wenn im UDT Attribute verwendet werden, die mindestens die angegebene Größe besitzen. Ansonsten wird auf ein Vielfaches des größten Attribut-Datentyps ausgeweitet. Wird FIELD ausgelassen, verwendet FreeBASIC, je nach Betriebssystem, den Wert 4 oder den Wert 8.
Abhängig von der Größe des größten Attribut-Datentyps verwendet FreeBASIC also
- ein Vielfaches von 1 bei 1 Byte großen Datentypen
- ein Vielfaches von 2 bei 2 Byte großen Datentypen
- ein Vielfaches von 4 bei 4 Byte großen Datentypen
- ein Vielfaches von 4 bei 8 Byte großen Datentypen unter DOS und 32bit x86 Linux/BSD
- ein Vielfaches von 8 bei 8 Byte großen Datentypen unter Win32/Win64, 32bit ARM Linux und 64bit x86_64/AArch64 Linux/BSD
- die größte natürliche Grenze der Attribute von TYPE/UNION-Datentypen
- Der Descriptor eines dynamischen STRINGs wird als TYPE-Struktur behandelt, dessen Datenpointer die größte natürliche Ausdehnung besitzt (also SIZEOF(ANY PTR)).
- Strings fester Länge werden abhängig von der Größe eines String-Characters ausgedehnt.
- Statische Arrays werden abhängig von der Größe des Datentyps ihrer Elemente ausgedehnt.
Beispiel:
Type NormalPacked
i As Long
b As Byte
End Type
Type BytePacked Field = 1
i As Long
b As Byte
End Type
Type WordPacked Field = 2
i As Long
b As Byte
End Type
Type DWordPacked Field = 4
i As Long
b As Byte
End Type
' Im Folgenden hat FIELD keinen Effekt
Type ShortType Field = 4
s1 As Short
s2 As Short
b As Byte
End Type
Print "Groesse der einzelnen Datentypen"
Print "Long : " & SizeOf(Long)
Print "Byte : " & SizeOf(Byte)
Print
Print "Groesse der verschiedenen UDTs"
Print "Ohne Field : " & SizeOf(NormalPacked)
Print "Field = 1 : " & SizeOf( BytePacked)
Print "Field = 2 : " & SizeOf( WordPacked)
Print "Field = 4 : " & SizeOf( DWordPacked)
Print "Ohne Long : " & SizeOf( ShortType)
Sleep
Ausgabe:
Groesse der einzelnen Datentypen
Long : 4
Byte : 1
Groesse der verschiedenen UDTs
Ohne Field : 8
Field = 1 : 5
Field = 2 : 6
Field = 4 : 8
Ohne Long : 6
Unterschiede zu QB:
- QB unterstützt kein Padding. Die Feldbreite ist immer 1. Beachten Sie dies, wenn Sie Dateien, die von QB generiert wurden in FreeBASIC einlesen.
- Unter QB wird FIELD verwendet, um die Puffergröße bei RANDOM-Files festzulegen. Diese Verwendung ist unter FreeBASIC nicht mehr möglich.
Plattformbedingte Unterschiede:
- Das Standardpadding unter 32bit x86 Linux/BSD und DOS ist 4 Byte.
- Das Standardpadding unter 32bit ARM Linux, 64bit x86_64/AArch64 Linux/BSD und unter Windows ist 8 Byte.
Unterschiede unter den FB-Dialektformen:
Das Standardpadding in -lang fb und -lang fblite hängt von der Plattform ab, während in -lang qb kein Padding durchgeführt wird.
Siehe auch:
TYPE (UDT), Datentypen und Deklarationen
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|