Mutató elrendezése
A mutatóelrendezés egy struktúra vagy tömb mutatóit ismerteti.
pointer_layout<>
A pointer_layout<> mező a formázási karakterekből FC_PP FC_PAD, majd egy vagy több mutatóleírásból áll, a későbbiekben leírtak szerint, és egy FC_END formátumkarakterrel végződik:
FC_PP
FC_PAD
{ pointer_instance_layout<> }*
FC_END
A pointer_instance_layout<> mező egy olyan formátumsztring, amely egyetlen vagy több mutatópéldányt ír le. Ezek a leírók a következő mezőket használják:
offset_in_memory
Az aláírt eltolás a mutató helyéhez a memóriában. A szerkezetben található mutató esetében ez az eltolás negatív eltolás a szerkezet végétől (a megfelelő struktúrák nem konformáns részének vége); tömbök esetén az eltolás a tömb elejéről származik.
offset_in_buffer
Az aláírt eltolás a mutató helyére a pufferben. Egy struktúrában található mutató esetében ez az eltolás negatív eltolás a struktúra végétől (a megfelelő struktúrák nem konformáló részének végétől): tömbök esetén az eltolás a tömb elejéről származik.
offset_to_array
Eltolás egy beágyazott struktúrából a beágyazott tömbbe, amelynek mutatóit kezelik. Felső szintű tömbök esetén ez a mező mindig nulla lesz.
Ismétléseket
Az azonos elrendezésű mutatók teljes száma<> leírt.
növekmény
Egymást követő mutatók közötti növekmény ismétlés közben.
number_of_pointers
Ismétlődő példány különböző mutatóinak száma.
pointer_description
Mutató leírása.
Minden mutatópéldány-elrendezés a következő egyetlen pointer_instance<8>:
offset_to_pointer_in_memory<2>
offset_to_pointer_in_buffer<2>
pointer_description<4>
A példányleírók a következők:
mutató egyetlen példánya egyszerű típusra:
FC_NO_REPEAT FC_PAD
pointer_instance<8>
Rögzített ismétlésmutató:
FC_FIXED_REPEAT FC_PAD
iterations<2>
increment<2>
offset_to_array<2>
number_of_pointers<2>
{ pointer_instance<8> }*
változó ismétlési mutatója:
FC_VARIABLE_REPEAT (FC_FIXED_OFFSET | FC_VARIABLE_OFFSET)
increment<2>
offset_to_array<2>
number_of_pointers<2>
{ pointer_instance<8> }*
A rögzített ismétlési és változóismétlési mutatópéldányok esetében az ismétlési példány minden egyes mutatójának eltolás- és mutatóleírásai vannak.
A mutató elrendezésével kapcsolatos tervezési problémák
Ez a szakasz a megfelelő struktúrák és beágyazott mutatók feldolgozásával kapcsolatos problémákat ismerteti. A probléma az, hogy a fordító mutatóelrendezéseket hoz létre bizonyos redundanciával rendelkező struktúrákhoz és tömbökhöz. Ez azért hasznos, mert az információk hasznosak, és így például egy megfelelő szerkezet egy mutatóelrendezést követve kiszolgálhatja a szerkezet összes mutatóját, valamint a megfelelő tömbből származó összes mutatót, amely a megfelelő szerkezet részét képezi. Vannak azonban olyan beágyazott helyzetek, amelyek megkövetelik, hogy az NDR-motor további munkát végezzen a mutatóelrendezések megfelelő sorrendben történő feldolgozásához, és az egyes mutatókat pontosan egyszer dolgozza fel.
A fordító által generált adatok
Az ebben a szakaszban tárgyalt összes objektum rendelkezik mutatókkal, így például egy megfelelő szerkezet mutatói a szerkezetrészben és a tömbelemekben is szerepelnek. Az elem egy egyszerű szerkezet, mutatóval.
Konformitási struktúra, egyszintű
A megfelelő leíró egy PP-kijelzővel rendelkezik, amelyben az összes mutató le van írva, mind a szerkezetből, mind a tömbből. A taglista mutató helyett FC_LONG. A CARRAY tömbleíró egy embedded_complex használatával rendelkezik elemeket, és egyáltalán nem tartalmaznak mutatóleírókat. Az elem továbbra is egyetlen mutatóleíróval rendelkezik. A mutatóelrendezés a tagelrendezést egy megfelelő struktúrában és egyszerű szerkezetleírókban előzi meg.
Megfelelő szerkezet, két vagy több szint
A PP-leírásban minden szint mutatói vannak. Ugyanazt a tömbleírást használja újra, mint a belső megfelelő struktúra. A taglista mutató helyett FC_LONG. A beágyazott struktúra beágyazott komplexum használatával jön létre. A megfelelő struktúraleíró újra felhasználható as-is. A szerkezet lapos részének mérete is teljes, ami azt jelenti, hogy a felső szintű szerkezet mérete magában foglalja a beágyazott szerkezet lapos méretét.
Összetett struktúra, egyszintű
A mutatótagokat FC_POINTER jelöli. A mutató elrendezése egyszerűbb, így minden egyes FC_POINTER bejegyzéshez van mutatóleíró (4 bájt). A mutatóelrendezés egy tagsétálással párhuzamosan halad, vagyis egy FC_POINTER a következő mutató leírásának feldolgozását okozza. A CARRAY tömb mutatóelrendezéssel rendelkezik a tömb összes leírójával, majd egy beágyazott komplexum használatával. Az elemleíró újra felhasználható. A szerkezet lapos részének mérete teljes; más szóval a felső szintű struktúra lapos mérete magában foglalja a beágyazott struktúra lapos méretét. A tagelrendezés megelőzi az összetett struktúrák mutatóelrendezését.
Ezért a megfelelő tömb leírásának létrehozása eltér attól függően, hogy egy tömb egy konformáló szerkezeten belül vagy egy összetett szerkezeten belül.
Összetett struktúra, 2 vagy több szint, összetett összetett
A legfelső szintű összetett struktúra tagmutatókkal rendelkezik, a beágyazott összetett struktúra tagmutatókkal rendelkezik. A megfelelő struktúraleíró újra felhasználható. A tömbleíró felülről a beágyazott struktúra újrahasznált tömbje.
Összetett struktúra beágyazott konformáló szerkezettel
A Top=level conformant struktúra tagmutatókkal rendelkezik. A megfelelő struktúraleíró újra felhasználható as-is. A tömbleírót a rendszer újra felhasználja a beágyazott megfelelő szerkezetből; más szóval nincs mutatója a tömbleírón. Az elem mutatóleíróval rendelkezik.
Struktúrák tömbjei mutatókkal
A mutatókkal rendelkező egyszerű struktúrák tömbje SMFARRAY vagy CARRAY formátumban jön létre, attól függően, hogy a tömb méretezett-e, de mindkét esetben kész mutatóelrendezéssel rendelkezik (FIXED_REPEAT vagy VARIABLE_REPEAT). A mutató elrendezése a tagelrendezés előtt található.
A mutatókkal rendelkező összetett struktúrák tömbje BOGUS_ARRAY, függetlenül attól, hogy rögzített vagy méretű, és mindkét esetben nincs mutatóelrendezése.
Az NDR-motor feladata
Ez a szakasz az NDR-motor viselkedését ismerteti.
A rendőrbírói igazolvány
Konformitásos struktúrák és beágyazott konformáló szerkezet.
A legfelső szintű struktúra úgy viselkedik, mint egy egyszintű struktúra.
Beágyazott összetett struktúra megfelelő tömbbel
Minden összetett szerkezet a külső szerkezetet összetett szerkezetre kényszeríti. A beágyazott struktúra soha nem ássa meg a tömböt. Minden struktúra mindig beágyazott mutatókon megy keresztül, egyszerűen csak a tagok és a tagok FC_POINTER.
Összetett struktúra megfelelő szerkezettel
A legbe ágyazottabb konformitási struktúra a megfelelő tömböt és az összes pontot rögzíti. Az NDR motor soha nem ereszkedik le mélyebb beágyazott megfelelő struktúrákra, ha vannak ilyenek; ez leegyszerűsíti a megoldást, mivel a megfelelő struktúra levélobjektum, ami a beágyazott objektumok marshalingját illeti. A legfelső szintű összetett struktúra kihagyja a tömb-marsallálást.
A házasság megszüntetése, a felborulás és a felszabadítás áthalad
A házasság megszüntetése szimmetrikus a marsallok számára; az első művelet, amelyet összetett struktúrák esetében hajt végre, a pontok helyének megkeresése a pufferben a NdrComplexStructBufferSize függvény meghívásával. Ezután párhuzamosan bontja ki a hegyeket, és lehetővé teszi ugyanazt a sémát, amely lehetővé teszi, hogy a hegyeket helyesen lehessen használni. Nem szabad összekeverni a méretes tárgyakat és az egyesítőket; a memóriaképet nem szabad méretezhető objektumokhoz és egyesítőkhöz használni, csak a puffer tartalmához.
A helyes marsalláláshoz ésahoz használt zászlókat ugyanúgy használják a felhajtó és a szabadítás során, hogy a pontok pontosan egyszer legyenek járva.
Endianness pass
Eleinte az endianness pass némileg hasonlít a marsalling/unmarshaling; összetett struktúrák feldolgozásához két menet szükséges. Az első lépés átalakítja a sík részt, és megkeresi a pontozás helyét a pufferben, hasonlóan ahhoz, ahogyan a bufsizing végrehajtja ezt a műveletet a leválasztáshoz. A második lépés ezután átalakítja a pontokat.
Az endianness passz a következő módon különbözik: minden struktúrát és minden tagot meg kell léptetni, amíg a levéltag vagy elem egy egyszerű típus. Ez eltér a házasság nélküli állapottól; a házasság nélküli módban például soha nem szükséges a megfelelő struktúrákba ágyazott megfelelő struktúrákat vagy a megfelelő szerkezet bármely tagját feldolgozni. Egy másik probléma az, hogy az átalakítás nem idempotens művelet – ezért a nem házasító passz egyes darabok sérülés nélkül újrahaladását hajthatja végre, míg az átalakítást szigorúan egyszer kell elvégezni minden-minden-egyszerű típusú alapon.
Ezért az endianness algoritmus az alábbiak szerint foglalható össze. Az NDR-nek van egy fogalma a legfelső szintű megfelelő struktúráról, és egy jelölővel, amely szükség szerint megjelöli azt. Amikor első alkalommal sétál, például átalakítja a lapos részt, és a ponthelyek helyének megszerzéséhez, ez a fogalma nem lesz használva. Az NDR a struktúrák minden szintjének sík részein halad végig, és soha nem merészkedik a mutatófeldolgozásba. Végül az NDR laposan konvertálja a tömböt a legfelső szinten.
A második séta során a zászlóval jelölik meg a beágyazott mutató áthaladását, hogy elkerülje a megfelelő struktúrák mélyebb szintjeinek, majd a legmegfelelőbb szerkezetnek a beírását. Ily módon a zászló kényszerítené a közös marshaling/unmarshaling viselkedést, ami azért van, hogy elkerülje a mélyebb szintekre való leereszkedést a megfelelő struktúrákban.
A konformáló tömbökkel rendelkező összetett struktúrák második menete a következőképpen működik: az összetett struktúrák közösen működnek; ami azt jelenti, hogy a mélyebb szintek soha nem nézik meg vagy hagyják ki a megfelelő méretet vagy a megfelelő tömböket, és inkább egyszerűen végigjárják a tagjaikat anélkül, hogy megérintenék a tömböt.
A megfelelő struktúrákkal rendelkező összetett struktúrák esetében a megfelelő szerkezetnek tisztában kell lennie azzal, hogy legfelső szintű-e, és hogy összetett struktúrában van-e. A tömb lapos részét a legmegfelelőbb szerkezet dolgozza fel. A második menetben a legmegfelelőbb szerkezet kihagyná a lapos részt, és végighaladna a mutató elrendezésén, és visszatérne. A legösszetettebb szerkezet kihagyná a lapos részét, és kihagyná a mutató elrendezését is.
Az endianness robusztus aspektusa
Az endianness walk ellenőrzi a szokásos pufferen kívüli feltételeket, és elvégzi a nem megfelelő jellegű egyéb ellenőrzéseket. A korrelált értékeket (például a méretezési argumentumot és a megfelelő méretet) nem lehet elvégezni ezzel a lépéssel; a műveletet később hajtják végre, amikor a műveletet megszünteti.