Megosztás a következőn keresztül:


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.

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.