Struktúrák (RPC)
A struktúráknak számos kategóriája van, amelyek fokozatosan bonyolultabbak a marsallokhoz szükséges műveletek tekintetében. Egy egyszerű szerkezettel kezdődnek, amely egészként másolható blokkokkal, és egy összetett struktúrával kezdődnek, amelyet mezőnként kell szervizelni.
- Egyszerű struktúra
- Egyszerű struktúra mutatókkal
- Megfelelő szerkezet
- Mutatókkal
- Változó szerkezet (mutatóval vagy anélkül)
- kemény szerkezetű
- összetett struktúra
- tagelrendezés leírása
Jegyzet
A tömbkategóriákkal összehasonlítva nyilvánvalóvá válik, hogy csak a legfeljebb 64 000 méretű struktúrák írhatók le (a méret a szerkezet sík részére vonatkozik), vagyis az SM és az LG tömbök nem egyenértékűek.
struktúrák közös
igazítási
A puffer szükséges igazítása a szerkezet leválasztása előtt. Az érvényes értékek: 0, 1, 3 és 7 (a tényleges igazítás mínusz 1).
memory_size
A struktúra mérete a memóriában bájtban; a megfelelő struktúrák esetében ez a méret nem tartalmazza a tömb méretét.
offset_to_array_description
Eltolás az aktuális formátumú sztringmutatótól a szerkezetben található megfelelő tömb leírásához.
member_layout
A struktúra egyes elemeinek leírása. Az NDR rutinjainak csak akkor kell megvizsgálniuk egy típus formátumsztringjének ezt a részét, ha endian átalakításra van szükség, vagy ha a típus összetett struktúra.
pointer_layout
Lásd a Mutató elrendezése szakaszt.
Egyszerű struktúra
Az egyszerű szerkezetek csak alaptípusokat, rögzített tömböket és más egyszerű struktúrákat tartalmaznak. Az egyszerű szerkezet fő jellemzője, hogy blokkmásolható egészként.
FC_STRUCT alignment<1>
memory_size<2>
member_layout<>
FC_END
Egyszerű struktúra mutatókkal
A mutatókkal rendelkező egyszerű szerkezetek csak alaptípusokat, mutatókat, rögzített tömböket, egyszerű struktúrákat és más, mutatókkal rendelkező egyszerű struktúrákat tartalmaznak. Mivel az elrendezést<> csak az endianness átalakítás során kell megtekinteni, a leírás végére kerül.
FC_PSTRUCT alignment<1>
memory_size<2>
pointer_layout<>
member_layout<>
FC_END
Megfelelő struktúra
A konformáló szerkezetek csak alaptípusokat, rögzített tömböket és egyszerű struktúrákat tartalmaznak, és konformáló sztringet vagy konformáló tömböt kell tartalmazniuk. Ez a tömb valójában egy másik megfelelő struktúrában vagy megfelelő szerkezetben található, és a szerkezetbe beágyazott mutatókkal.
FC_CSTRUCT alignment<1>
memory_size<2>
offset_to_array_description<2>
member_layout<>
FC_END
Megfelelő struktúra mutatókkal
A mutatókkal rendelkező megfelelő struktúra csak alaptípusokat, mutatókat, rögzített tömböket, egyszerű struktúrákat és mutatókkal rendelkező egyszerű struktúrákat tartalmaz; a megfelelő szerkezetnek egy megfelelő tömböt kell tartalmaznia. Ez a tömb valójában egy másik, a szerkezetbe beágyazott mutatókkal rendelkező megfelelő struktúrában vagy konformáló szerkezetben is szerepelhet.
FC_CPSTRUCT alignment<1>
memory_size<2>
offset_to_array_description<2>
pointer_layout<>
member_layout<> FC_END
Megfelelő változó szerkezet (mutatóval vagy anélkül)
A változó szerkezetek csak egyszerű típusokat, mutatókat, rögzített tömböket, egyszerű struktúrákat és mutatókkal rendelkező egyszerű struktúrákat tartalmaznak; a megfelelő változó szerkezetnek egy megfelelő sztringet vagy egy konformáló-változó tömböt kell tartalmaznia. A konformáns sztring vagy tömb valójában egy másik megfelelő szerkezetben vagy egy megfelelő szerkezetben is szerepelhet, és az ebbe a struktúrába beágyazott mutatókkal.
FC_CVSTRUCT alignment<1>
memory_size<2>
offset_to_array_description<2>
[pointer_layout<>]
layout<>
FC_END
Kemény szerkezet
A kemény szerkezet egy olyan koncepció volt, amelynek célja az összetett struktúrák feldolgozásával kapcsolatos meredek büntetések kiküszöbölése. Abból a megfigyelésből származik, hogy egy összetett struktúrának általában csak egy vagy két feltétele van, amelyek megakadályozzák a blokkmásolást, ezért rontják a teljesítményét egy egyszerű struktúrához képest. A bűnösök általában egyesítő vagy számbavételi mezők.
A kemény struktúra olyan struktúra, amelynek enum16-os, végkitöltési memóriája van, vagy az utolsó tag egy egyesítés. Ez a három elem megakadályozza, hogy a struktúra az előző struktúrakategóriák egyikébe kerüljön, amelyek kis értelmezési többletterhelést és maximális optimalizálási potenciált élveznek, de nem kényszerítik a rendkívül költséges összetett struktúrakategóriába.
Az enum16 nem okozhatja a szerkezet memória- és vezetékméretének eltérését. A struktúra nem rendelkezhet konformáló tömbökkel és mutatókkal (kivéve, ha az egyesítés része); csak az alaptípusok, a rögzített tömbök és az egyszerű struktúrák engedélyezettek.
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
A enum_offset<2> mező az eltolást a memória szerkezetének kezdetétől egy enum16 értékig biztosítja, ha tartalmaz egyet; ellenkező esetben a enum_offset<2> mező –1.
A copy_size<2> mező a struktúrában található bájtok teljes számát adja meg, amelyek blokkmásolhatók a pufferbe vagy onnan. Ez az összeg nem tartalmaz semmilyen záró egyesítést, és nem tartalmaz végkitöltést a memóriában. Ez az érték az a mennyiség is, amelyet a puffermutatónak a másolás után növelnie kell.
A mem_copy_incr<2> mező az a bájtok száma, amelyet a memóriamutatót a blokkmásolás után kell növelni a záró egyesítés kezelése előtt. Ezzel az összeggel (nem copy_size<2> bájttal) való növekmény megfelelő memóriamutatót eredményez a záró egyesítéshez.
Összetett struktúra
Az összetett struktúra olyan szerkezet, amely egy vagy több mezőt tartalmaz, amelyek megakadályozzák a struktúra blokkmásolását, vagy amelyek esetében további ellenőrzést kell végrehajtani a marsallálás vagy a házasság megszüntetése során (például kötött ellenőrzések enumeráláskor). A következő NDR-típusok ebbe a kategóriába tartoznak:
- egyszerű típusok: ENUM16, __INT3264 (csak 64 bites platformokon), a [tartomány]
- igazítási párna a szerkezet végén
- illesztőmutatók (beágyazott komplexumot használnak)
- figyelmen kívül hagyott mutatók (amelyek a [] attribútum és FC_IGNORE tokenhez kapcsolódnak)
- összetett tömbök, változó tömbök, sztringtömbök
- többdimenziós konformáns tömbök legalább egy nemfixált dimenzióval
- Szakszervezetek
- [transmit_as], [represent_as], [wire_marshal], [user_marshal]
- beágyazott összetett struktúrák
- padding a szerkezet végén
Egy összetett struktúra formátumának leírása a következő:
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<>]
A memory_size<2> mező a memória struktúrájának mérete bájtban kifejezve.
Ha a szerkezet megfelelő tömböt tartalmaz, a offset_to_conformant_array_description<2> mező a megfelelő tömb leírásának eltolását adja meg, ellenkező esetben nulla.
Ha a struktúra mutatókkal rendelkezik, a offset_to_pointer_layout<2> mező a struktúra elrendezése és a mutatóelrendezés eltolását biztosítja, ellenkező esetben ez a mező nulla.
Az összetett szerkezet pointer_layout<> mezőjét némileg másképp kezelik, mint a többi struktúrát. Egy összetett struktúra pointer_layout<> mezője csak a tényleges mutatómezők leírását tartalmazza magában a struktúrában. A beágyazott tömbökben, egyesítőkben vagy struktúrákban található összes mutató nem szerepel az összetett struktúra pointer_layout<> mezőjében.
Jegyzet
Ez ellentétben áll más struktúrákkal, amelyek megkettőzik a beágyazott tömbökben vagy struktúrákban a saját mutatójuk _layout<> mezőjében található összes mutató leírását is.
Az összetett struktúra mutatóelrendezésének formátuma is gyökeresen eltér. Mivel csak a tényleges mutatótagok leírását tartalmazza, és mivel egy összetett struktúra egyszerre egy mezőre van felvéve, a pointer_layout<> mező egyszerűen az összes mutatótag mutatóleírását tartalmazza. Nincs kezdeti FC_PP, és a szokásos pointer_layout<> információk egyike sem.
Tagszerkezet elrendezésének leírása
A struktúra elrendezésleírása az alábbi formátumkarakterek közül legalább egyet tartalmaz:
Bármely alaptípus karaktere, például FC_CHAR stb.
Igazítási irányelvek. A memóriamutató igazítását három formátumkarakterek határozzák meg: FC_ALIGNM2, FC_ALIGNM4 és FC_ALIGNM8.
Jegyzet
Vannak pufferigazítási jogkivonatok is, FC_ALIGNB2 FC_ALIGNM8; ezeket nem használják.
Memóriakitöltés. Ezek csak a szerkezet leírásának végén fordulnak elő, és a szerkezet megfelelő tömbje előtt a memóriában lévő párnázás bájtjainak számát jelzik: FC_STRUCTPADn, ahol n a párnázás bájtjainak száma.
Bármilyen beágyazott nembázis típusú (vegye figyelembe azonban, hogy egy konformáló tömb soha nem fordul elő a struktúraelrendezésben). Ennek 4 bájtos leírása van:
FC_EMBEDDED_COMPLEX memory_pad<1> offset_to_description<2>,
ahol az eltolás nem garantáltan 2 bájtos igazítású.
memory_pad<1> a memóriában az összetett mező előtt szükséges párnázás.
offset_to_description<2> a beágyazott típushoz viszonyított eltolás.
Szükség esetén a FC_END megszüntetése előtt FC_PAD is előfordulhat, hogy a formátumsztring a FC_END követő 2 bájtos határvonalhoz lesz igazítva.