Strukturen (RPC)
Es gibt mehrere Kategorien von Strukturen, zunehmend komplizierter in Bezug auf Maßnahmen, die für das Marshalling erforderlich sind. Sie beginnen mit einer einfachen Struktur, die als ganzer Block kopiert werden kann, und fahren mit einer komplexen Struktur fort, die nach Feld gewartet werden muss.
- Einfache Struktur
- Einfache Struktur mit Zeigern
- Konforme Struktur
- Konforme Struktur mit Zeigern
- Konforme unterschiedliche Struktur (mit oder ohne Zeiger)
- Harte Struktur
- Komplexe Struktur
- Layoutbeschreibung des Strukturelements
Hinweis
Im Vergleich zu Arraykategorien wird deutlich, dass nur Strukturen mit einer Größe von bis zu 64k beschrieben werden können (die Größe ist für den flachen Teil der Struktur), d. h. es gibt keine Entsprechung von SM- und LG-Arrays.
Elemente, die Strukturen gemeinsam sind
Ausrichtung
Die erforderliche Ausrichtung des Puffers, bevor die Struktur aufgehoben wird. Gültige Werte sind 0, 1, 3 und 7 (die tatsächliche Ausrichtung minus 1).
memory_size
Größe der Struktur im Arbeitsspeicher in Byte; bei konformen Strukturen enthält diese Größe nicht die Größe des Arrays.
offset_to_array_description
Offset vom aktuellen Formatzeichenfolgenzeiger auf die Beschreibung des konformen Arrays, das in einer Struktur enthalten ist.
member_layout
Beschreibung der einzelnen Elemente der Struktur. Die NDR-Routinen müssen diesen Teil der Formatzeichenfolge eines Typs nur untersuchen, wenn eine endianische Transformation erforderlich ist oder der Typ eine komplexe Struktur ist.
pointer_layout
Weitere Informationen finden Sie im Abschnitt Zeigerlayout.
Einfache Struktur
Eine einfache Struktur enthält nur Basistypen, feste Arrays und andere einfache Strukturen. Das Standard Feature der einfachen Struktur besteht darin, dass sie als Ganzes blockiert werden kann.
FC_STRUCT alignment<1>
memory_size<2>
member_layout<>
FC_END
Einfache Struktur mit Zeigern
Eine einfache Struktur mit Zeigern enthält nur Basistypen, Zeiger, feste Arrays, einfache Strukturen und andere einfache Strukturen mit Zeigern. Da das Layout <> nur bei einer Endianitätskonvertierung besucht werden muss, steht es am Ende der Beschreibung.
FC_PSTRUCT alignment<1>
memory_size<2>
pointer_layout<>
member_layout<>
FC_END
Konforme Struktur
Eine konforme Struktur enthält nur Basistypen, feste Arrays und einfache Strukturen und muss entweder eine konforme Zeichenkette oder ein konformes Array enthalten. Dieses Array könnte tatsächlich in einer anderen konformen Struktur oder konformen Struktur mit Zeigern enthalten sein, die in diese Struktur eingebettet sind.
FC_CSTRUCT alignment<1>
memory_size<2>
offset_to_array_description<2>
member_layout<>
FC_END
Konforme Struktur mit Zeigern
Eine konforme Struktur mit Zeigern enthält nur Basistypen, Zeiger, feste Arrays, einfache Strukturen und einfache Strukturen mit Zeigern; eine konforme Struktur muss ein konformes Array enthalten. Dieses Array könnte tatsächlich in einer anderen konformen Struktur oder konformen Struktur mit Zeigern enthalten sein, die in diese Struktur eingebettet sind.
FC_CPSTRUCT alignment<1>
memory_size<2>
offset_to_array_description<2>
pointer_layout<>
member_layout<> FC_END
Konforme unterschiedliche Struktur (mit oder ohne Zeiger)
Eine konforme unterschiedliche Struktur enthält nur einfache Typen, Zeiger, feste Arrays, einfache Strukturen und einfache Strukturen mit Zeigern; eine konforme unterschiedliche Struktur muss entweder eine konforme Zeichenfolge oder ein konformes, unterschiedliches Array enthalten. Die konforme Zeichenkette oder das Array kann tatsächlich in einer anderen konformen Struktur oder konformen Struktur mit Zeigern enthalten sein, die in diese Struktur eingebettet sind.
FC_CVSTRUCT alignment<1>
memory_size<2>
offset_to_array_description<2>
[pointer_layout<>]
layout<>
FC_END
Harte Struktur
Die harte Struktur war ein Konzept, das darauf abzielte, die mit der Verarbeitung komplexer Strukturen verbundenen empfindlichen Strafen zu beseitigen. Es wird von einer Beobachtung abgeleitet, dass eine komplexe Struktur in der Regel nur eine oder zwei Bedingungen aufweist, die Blockkopien verhindern und daher ihre Leistung im Vergleich zu einer einfachen Struktur beeinträchtigen. Die Schuldigen sind in der Regel Vereinigungen oder Aufzählungsfelder.
Eine harte Struktur ist eine Struktur mit einer Aufzählung16, einem Endabstand im Speicher oder einer Vereinigung als letztes Mitglied. Diese drei Elemente verhindern, dass die Struktur in eine der vorherigen Strukturkategorien fällt, die geringen Interpretationsaufwand und maximale Optimierungspotenziale genießen, aber sie nicht in die sehr kostspielige komplexe Strukturkategorie zwingen.
Die Aufzählung16 darf nicht dazu führen, dass sich die Speicher- und Leitungsgrößen der Struktur unterscheiden. Die Struktur kann weder über ein konformes Array noch über Zeiger verfügen (es sei denn, sie sind Teil der Vereinigung); Die einzigen zulässigen Elemente sind Basistypen, feste Arrays und einfache Strukturen.
FC_HARD_STRUCTURE alignment<1>
memory_size<2>
reserved<4>
enum_offset<2>
copy_size<2>
mem_copy_incr<2>
union_description_offset<2>
member_layout<>
FC_END
Das enum_offset<2-Feld> stellt den Offset vom Anfang der Struktur im Speicher zu einer Aufzählung16 bereit, wenn es einen enthält. Andernfalls ist das enum_offset<2-Feld> –1.
Das Feld copy_size<2> stellt die Gesamtanzahl der Bytes in der Struktur bereit, die möglicherweise in/aus dem Puffer kopiert werden. Diese Summe umfasst weder eine nachstehende Vereinigung noch eine End-Auffüllung im Speicher. Dieser Wert ist auch der Betrag, um den der Pufferzeiger nach der Kopie erhöht werden sollte.
Das Feld mem_copy_incr<2> ist die Anzahl der Bytes, die der Speicherzeiger nach der Blockkopie erhöht werden soll, bevor eine nachstehende Vereinigung behandelt wird. Durch die Erhöhung dieses Betrags (nicht durch copy_size<2> Byte) wird ein richtiger Speicherzeiger auf eine nachstehende Vereinigung erzielt.
Komplexe Struktur
Eine komplexe Struktur ist eine beliebige Struktur, die ein oder mehrere Felder enthält, die entweder verhindern, dass die Struktur blockiert wird, oder für die während Marshalling oder Unmarshaling eine zusätzliche Überprüfung durchgeführt werden muss (z. B. gebundene Prüfungen auf einer Enumeration). Die folgenden NDR-Typen fallen in diese Kategorie:
- Einfache Typen: ENUM16, __INT3264 (nur auf 64-Bit-Plattformen), ein Integral mit [Bereich]
- Ausrichtungsauffüllung am Ende der Struktur
- Schnittstellenzeiger (sie verwenden einen eingebetteten Komplex)
- Ignorierte Zeiger (die mit dem Attribut [ignore] und FC_IGNORE Token zusammenhängen)
- Komplexe Arrays, unterschiedliche Arrays, Zeichenfolgenarrays
- Multidimensionale konforme Arrays mit mindestens einer nichtfixierten Dimension
- Vereinigungen
- mit [transmit_as], [represent_as], [wire_marshal], [user_marshal] definierte Elemente
- Eingebettete komplexe Strukturen
- Abstand am Ende der Struktur
Eine komplexe Struktur weist die folgende Formatbeschreibung auf:
FC_BOGUS_STRUCT alignment<1>
memory_size<2>
offset_to_conformant_array_description<2>
offset_to_pointer_layout<2>
member_layout<>
FC_END
[pointer_layout<>]
Das Feld memory_size<2> ist die Größe der Struktur im Arbeitsspeicher in Bytes.
Wenn die Struktur ein konformes Array enthält, stellt das Feld offset_to_conformant_array_description<2> den Offset zur Beschreibung des konformen Arrays bereit, andernfalls ist es Null.
Wenn die Struktur Zeiger aufweist, stellt das Feld offset_to_pointer_layout<2> den Offset über das Layout der Struktur bis zum Zeigerlayout bereit, andernfalls ist dieses Feld null.
Das pointer_layout<> Feld einer komplexen Struktur wird etwas anders behandelt als für andere Strukturen. Das pointer_layout<> Feld einer komplexen Struktur enthält nur Beschreibungen der tatsächlichen Zeigerfelder in der Struktur selbst. Alle Zeiger, die in eingebetteten Arrays, Vereinigungen oder Strukturen enthalten sind, werden nicht im pointer_layout<> Feld der komplexen Struktur beschrieben.
Hinweis
Dies steht im Gegensatz zu anderen Strukturen, die die Beschreibung aller Zeiger, die in eingebetteten Arrays oder Strukturen enthalten sind, auch in ihrem eigenen pointer_layout<> Feld duplizieren.
Das Format des Zeigerlayouts einer komplexen Struktur unterscheidet sich ebenfalls radikal. Da sie nur Beschreibungen der tatsächlichen Zeigermember enthält und eine komplexe Struktur jeweils Feld für Feld gemarshallt und unmarshallt wird, enthält das Feld pointer_layout<> einfach die Zeigerbeschreibung aller Zeigermitglieder. Es gibt keinen Anfang FC_PP und keine der üblichen pointer_layout<> Informationen.
Layoutbeschreibung des Strukturelements
Die Layoutbeschreibung einer Struktur enthält ein oder mehrere der folgenden Formatzeichen:
Eines der Basistypzeichen, z. B. FC_CHAR usw.
Ausrichtungsrichtung. Es gibt drei Formatzeichen, die die Ausrichtung des Speicherzeigers angeben: FC_ALIGNM2, FC_ALIGNM4 und FC_ALIGNM8.
Hinweis
Es gibt auch Pufferausrichtungstoken, FC_ALIGNB2 über FC_ALIGNM8; diese werden nicht verwendet.
Speicherauffüllung. Diese treten nur am Ende der Beschreibung einer Struktur auf und geben die Anzahl der Bytes der Auffüllung im Arbeitsspeicher vor dem konformen Array in der Struktur an: FC_STRUCTPADn, wobei n die Anzahl der Bytes der Auffüllung ist.
Jeder eingebettete Nichtbasistyp (beachten Sie jedoch, dass ein konformes Array nie im Strukturlayout auftritt). Dieser hat eine 4-Byte-Beschreibung:
FC_EMBEDDED_COMPLEX memory_pad<1> offset_to_description<2>,
wenn der Offset nicht garantiert 2-Byte ausgerichtet ist.
memory_pad <1> ist eine Auffüllung, die im Arbeitsspeicher vor dem komplexen Feld erforderlich ist.
<offset_to_description 2> ist ein relativer Typversatz zum eingebetteten Typ.
Möglicherweise gibt es auch eine FC_PAD vor dem Beenden FC_END, um sicherzustellen, dass die Formatzeichenfolge an einer Grenze von 2 Byte nach dem FC_END ausgerichtet wird.