Tablice (RPC)
Zdefiniowano kilka kategorii tablicy na podstawie ich cech wydajności, przede wszystkim tego, czy tablica może być kopiowana blokowo.
W przypadku niektórych kategorii, takich jak tablica o stałym rozmiarze, istnieją dwa typy deskryptorów tablicy; są one wskazywane przez poprawkę w nazwie wiodącego tokenu fc.
Formatuj znak | Opis |
---|---|
SM | Całkowity rozmiar typu może być reprezentowany w 16-bitowym niepodpisanym int. |
LG | Całkowity rozmiar typu wymaga reprezentowania 32-bitowej długości bez znaku. |
Pola wspólne dla tablic:
total_size
Całkowity rozmiar tablicy w pamięci w bajtach. Jest to takie samo, jak rozmiar przewodu po wyrównaniu. Całkowity rozmiar jest obliczany dla kategorii, dla których problem z wypełnieniem nie istnieje, a rozmiar jest rzeczywisty rozmiar tablicy.
element_size
Całkowity rozmiar pamięci pojedynczego elementu tablicy, w tym wypełnienie (może się to zdarzyć tylko w przypadku złożonych tablic).
element_description
Opis typu elementu tablicy.
pointer_layout
Aby uzyskać więcej informacji, zobacz temat Układ wskaźnika.
Tablice o stałym rozmiarze
Ciąg formatu tablicy o stałym rozmiarze jest generowany dla tablic o znanym rozmiarze i dlatego może być kopiowany blokowo do buforu marshalingu. Dwa stałe formaty deskryptora tablicy są następujące.
FC_SMFARRAY alignment<1>
total_size<2>
[pointer_layout<>]
element_description<>
FC_END
i
FC_LGFARRAY alignment<1>
total_size<4>
[pointer_layout<>]
element_description<>
FC_END
Zgodna tablica
Zgodna tablica może być kopiowana blokowo, gdy jest znany rozmiar tablicy.
FC_CARRAY alignment<1>
element_size<2>
conformance_description<>
[pointer_layout<>]
element_description<>
FC_END
Conformance_description<> jest deskryptorem korelacji i ma 4 lub 6 bajtów w zależności od tego, czy /robust jest używany.
Zgodna tablica
Zgodna tablica może być również kopiowana blokowo.
FC_CVARRAY alignment<1>
element_size<2>
conformance_description<>
variance_description<>
[pointer_layout<>]
element_description<>
FC_END
Conformance_description<> i variance_description<> to deskryptor korelacji i ma 4 lub 6 bajtów w zależności od tego, czy jest używana /niezawodna.
Różna tablica
Różne tablice mają dwie możliwości w zależności od rozmiaru tablicy.
FC_SMVARRAY alignment<1>
total_size<2>
number_elements<2>
element_size<2>
variance_description<>
[pointer_layout<>]
element_description<>
FC_END
FC_LGVARRAY alignment<1>
total_size<4>
number_elements<4>
element_size<2>
variance_description<4>
[pointer_layout<>]
element_description<>
FC_END
Variance_description<> jest deskryptorem korelacji i ma 4 lub 6 bajtów w zależności od używanego /robust.
W przypadku różnych tablic osadzonych wewnątrz struktury przesunięcie<2> pola variance_description<> jest względnym przesunięciem od położenia zmiennej tablicy w strukturze do wariancji opisującej pole. Przesunięcie jest zwykle względem początku struktury.
Tablice złożone
Tablica zespolona to dowolna tablica z elementem, który uniemożliwia kopiowanie bloków, a w związku z tym należy podjąć dodatkowe działania. Te elementy sprawiają, że tablica jest złożona:
- proste typy: ENUM16, __INT3264 (tylko na platformach 64-bitowych), całkowita część z zakresem []
- wskaźniki referencyjne i interfejsu (wszystkie wskaźniki na platformach 64-bitowych)
- Związków
- złożone struktury (zobacz temat Opis struktury złożonej, aby uzyskać pełną listę przyczyn, dla których struktura ma być złożona)
- elementy zdefiniowane za pomocą [transmit_as], [user_marshal]
- Wszystkie tablice wielowymiarowe z co najmniej jednym zgodnym i/lub różnym wymiarem są złożone niezależnie od typu podstawowego elementu.
Opis tablicy złożonej wygląda następująco:
FC_BOGUS_ARRAY alignment<1>
number_of_elements<2>
conformance_description<>
variance_description<>
element_description<>
FC_END
Pole number_of_elements<2> ma wartość zero, jeśli tablica jest zgodna.
Conformance_description<> i variance_description<> to deskryptor korelacji i ma 4 lub 6 bajtów w zależności od tego, czy jest używana /niezawodna. Jeśli tablica ma zgodność i/lub wariancję, conformance_description<> i/lub variance_description<> pola mają prawidłowe opisy, w przeciwnym razie pierwsze 4 bajty deskryptora korelacji są ustawione na 0xFFFFFFFF. Flagi, gdy są obecne, są ustawione na zero.