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


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.

  1. 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.

  2. 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.

  3. Ö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.

  4. Ö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.

  5. Ö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.

  6. 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

  1. Konformitásos struktúrák és beágyazott konformáló szerkezet.

    A legfelső szintű struktúra úgy viselkedik, mint egy egyszintű struktúra.

  2. 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.

  3. Ö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.