Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Aanwijzerindeling beschrijft aanwijzers van een structuur of een matrix.
pointer_layout<>
Een pointer_layout<> veld bestaat uit de notatietekens FC_PP FC_PAD gevolgd door een of meer beschrijvingen van de aanwijzer, zoals later wordt beschreven en eindigen met een FC_END-notatieteken:
FC_PP
FC_PAD
{ pointer_instance_layout<> }*
FC_END
Een pointer_instance_layout<> veld is een notatietekenreeks die één of meerdere exemplaren van aanwijzers beschrijft. De volgende velden worden gebruikt in deze descriptors:
offset_in_memory
De ondertekende offset naar de locatie van de aanwijzer in het geheugen. Voor een aanwijzer die zich in een structuur bevindt, is deze offset een negatieve verschuiving van het einde van de structuur (het einde van het niet-conforme gedeelte van conforme structuren); voor matrices is de verschuiving vanaf het begin van de matrix.
offset_in_buffer
De ondertekende offset naar de locatie van de aanwijzer in de buffer. Voor een aanwijzer die zich in een structuur bevindt, is deze offset een negatieve verschuiving van het einde van de structuur (het einde van het niet-conforme gedeelte van conforme structuren): voor matrices is de offset vanaf het begin van de matrix.
offset_to_array
Verschuiving van een omsluitstructuur naar de ingesloten matrix waarvan de aanwijzers worden verwerkt. Voor matrices op het hoogste niveau is dit veld altijd nul.
Iteraties
Het totale aantal aanwijzers met dezelfde indeling<> beschreven.
vermeerdering
Oplopen tussen opeenvolgende aanwijzers tijdens een REPEAT.
number_of_pointers
Aantal verschillende aanwijzers in een herhalingsexemplaren.
pointer_description
Beschrijving van aanwijzer.
Alle indelingen voor aanwijzerexemplaren gebruiken de volgende enkele pointer_instance<8>:
offset_to_pointer_in_memory<2>
offset_to_pointer_in_buffer<2>
pointer_description<4>
Hier volgen exemplaardescriptors:
Enkele instantie van een aanwijzer naar een eenvoudig type:
FC_NO_REPEAT FC_PAD
pointer_instance<8>
vaste herhalingswijzer:
FC_FIXED_REPEAT FC_PAD
iterations<2>
increment<2>
offset_to_array<2>
number_of_pointers<2>
{ pointer_instance<8> }*
variabele herhalingswijzer:
FC_VARIABLE_REPEAT (FC_FIXED_OFFSET | FC_VARIABLE_OFFSET)
increment<2>
offset_to_array<2>
number_of_pointers<2>
{ pointer_instance<8> }*
Voor vaste herhalings- en variabele herhalingspunten is er een set offset- en aanwijzerbeschrijvingen voor elke aanwijzer in het herhalingsexemplaren.
Ontwerpproblemen met aanwijzers
In deze sectie worden problemen behandeld met betrekking tot de verwerking van conforme structuren en ingesloten aanwijzers. Het probleem is dat de compiler pointer-indelingen genereert voor structuren en matrices met enige redundantie. Dit is nuttig, omdat de informatie nuttig is en als zodanig, kan een conforme structuur bijvoorbeeld één aanwijzerindeling doorlopen om alle aanwijzers uit de structuur en van de conforme matrix deel uit te maken van de conforme structuur. Er bestaan echter enkele ingesloten situaties waarvoor de NDR-engine extra werk moet uitvoeren om alle aanwijzerindelingen in de juiste volgorde te verwerken, waarbij elke aanwijzer precies één keer wordt verwerkt.
Wat de compiler genereert
Elk object dat in deze sectie wordt besproken, heeft aanwijzers, dus een conforme structuur bevat aanwijzers in het structuuronderdeel en in de matrixelementen. Het element is een eenvoudige structuur met een aanwijzer.
Conforme structuur, één niveau
De conforme descriptor heeft een PP-onderdeel waarin alle aanwijzers worden beschreven, zowel van de structuur als van de matrix. De ledenlijst bevat FC_LONG in plaats van een aanwijzer. De CARRAY-matrixdescriptor bevat elementen door gebruik te maken van een embedded_complex en helemaal geen aanwijzerdescriptors. Het element heeft nog steeds descriptor voor één aanwijzer. Aanwijzerindeling gaat vooraf aan de lidindeling in een conforme structuur en eenvoudige structuurdescriptors.
Conforme structuur, twee of meer niveaus
De pp-beschrijving bevat aanwijzers van alle niveaus. Deze gebruikt dezelfde matrixbeschrijving als de interne conforme structuur. De ledenlijst bevat FC_LONG in plaats van een aanwijzer. Een ingesloten structuur komt door het gebruik van een ingesloten complex. De conforme structuurdescriptor wordt opnieuw gebruikt as-is. De grootte van het platte gedeelte van de structuur komt ook volledig uit, wat betekent dat de grootte van de structuur op het hoogste niveau de platte grootte van de ingesloten structuur zou bevatten.
Complexe structuur, één niveau
Aanwijzerleden worden gemarkeerd door FC_POINTER. De indeling van de aanwijzer wordt vereenvoudigd, zodat er een aanwijzerdescriptor (4 bytes) is voor elke FC_POINTER vermelding in de lijst. De lay-out van de aanwijzer wordt parallel met een lidwandeling doorlopen, dat wil gezegd, een FC_POINTER ervoor zorgt dat de volgende beschrijving van de aanwijzer wordt verwerkt. De CARRAY-matrix heeft een aanwijzerindeling met alle descriptors van de matrix en vervolgens element, door gebruik te maken van een ingesloten complex. De elementdescriptor wordt opnieuw gebruikt. De grootte van het platte gedeelte van de structuur komt volledig uit; met andere woorden, de platte grootte van de structuur op het hoogste niveau bevat de platte grootte van de ingesloten structuur. De lidindeling gaat vooraf aan de aanwijzerindeling voor complexe structuren.
Daarom is de generatie van de conforme matrixbeschrijving anders, afhankelijk van of het een matrix is binnen een conforme structuur of binnen een complexe structuur.
Complexe structuur, 2 of meer niveaus, complex in complex
Complexe structuur op het hoogste niveau heeft de ledenpointers, ingesloten complexe structuur heeft de ledenwijzers. De conforme structuurdescriptor wordt opnieuw gebruikt. De matrixdescriptor vanaf de bovenkant is de opnieuw gebruikte matrix uit de ingesloten structuur.
Complexe structuur met een ingesloten conforme structuur
De conforme structuur op het hoogste niveau heeft de leden aanwijzers. De conforme structuurdescriptor wordt opnieuw gebruikt as-is. De matrixdescriptor wordt opnieuw gebruikt vanuit de ingesloten conforme structuur; met andere woorden, het heeft geen aanwijzers op de matrixdescriptor. Het element heeft de aanwijzerdescriptor.
Matrices van structuren met aanwijzers
Een matrix van eenvoudige structuren met aanwijzers wordt gegenereerd als een SMFARRAY of CARRAY, afhankelijk van of de matrix de grootte heeft, maar in beide gevallen heeft het een volledige aanwijzerindeling (FIXED_REPEAT of VARIABLE_REPEAT). De aanwijzerindeling wordt vóór de lidindeling weergegeven.
Een matrix van complexe structuren met aanwijzers wordt gegenereerd als BOGUS_ARRAY ongeacht of deze vast of groot is, en in beide gevallen geen aanwijzerindeling heeft.
Wat de NDR-engine doet
In deze sectie wordt het gedrag van de NDR-engine beschreven.
De marshaling pass
Conforme structuren en ingesloten conforme structuur.
De structuur op het hoogste niveau gedraagt zich als een structuur op één niveau.
Ingesloten complexe structuur met conforme matrix
Elke complexe structuur dwingt de buitenste structuur tot een complexe structuur. Ingesloten structuur zorgt er nooit voor dat de matrix wordt gebruikt. Elke structuur doorloopt altijd ingesloten aanwijzers door simpelweg marshaling leden en een lid wordt een FC_POINTER.
Complexe structuur met conforme structuur
De meest ingesloten conforme structuur marshalt de conforme matrix en alle aanwijzers. De NDR-engine daalt nooit af naar diepere geneste conforme structuren als die er zijn; dit vereenvoudigt de oplossing, aangezien een conforme structuur een bladobject is wat het marshaling van ingesloten objecten betreft. De complexe structuur op het hoogste niveau slaat de matrix marshaling over.
Niet-marshaling, bufsizing en vrijmaken
Unmarshaling is symmetrisch voor marshaling; de eerste bewerking die wordt uitgevoerd voor complexe structuren is om de locatie van de aanwijzers in de buffer te achterhalen door de NdrComplexStructBufferSize-functie aan te roepen. Vervolgens worden pointees parallel niet weergegeven, waardoor hetzelfde schema wordt ingeschakeld voor het op de juiste wijze gebruiken van de aanwijzers. Er mag geen verwarring bestaan over de grootte van objecten en vakbonden; de geheugenafbeelding mag niet worden gebruikt voor het formaat van objecten en samenvoegingen, alleen voor de inhoud van de buffer.
De vlaggen die worden gebruikt om marshaling en unmarshaling correct uit te voeren, worden op dezelfde manier gebruikt bij bufsizing en vrijmaken om ervoor te zorgen dat pointees precies eenmaal worden doorlopen.
Endianness pass
In eerste instantie is de endianness pass enigszins vergelijkbaar met marshaling/unmarshaling; er zijn twee passen vereist om complexe structuren te verwerken. First Pass converteert het platte deel en vindt de locatie van de aanwijzers in de buffer vergelijkbaar met de manier waarop bufsizing deze bewerking uitvoert voor niet-marsing. De tweede pas converteert vervolgens de aanwijzers.
Endianness passeert op de volgende manier: elke structuur en elk lid moet worden getrapt totdat het bladlid of element een eenvoudig type is. Dit verschilt van niet-marsen; bij niet-marshaling is er bijvoorbeeld nooit behoefte aan het verwerken van conforme structuren die zijn ingesloten in conforme structuren, of een lid van de conforme structuur. Een ander probleem is dat de conversie geen idempotente bewerking is, waardoor de niet-marsende pas sommige delen zonder schade opnieuw kan uitvoeren, terwijl de conversie strikt één keer per een eenvoudige type basis moet worden uitgevoerd.
Daarom kan het algoritme voor endianness worden samengevat als het volgende. NDR heeft een idee van de conforme structuur op het hoogste niveau en een vlag om die, indien van toepassing, te markeren. Bij het lopen van de eerste keer, zoals het converteren van het platte gedeelte en het verkrijgen van de locatie van de aanwijzers, zou dit begrip niet worden gebruikt. NDR zou aflopen door de vlakke delen van alle niveaus van structuren en nooit in de aanwijzerverwerking wagen. Ten slotte zou NDR de matrix op het hoogste niveau plat converteren.
Wanneer u de tweede keer loopt, wordt de vlag gebruikt om de pass van de ingesloten aanwijzer te markeren om te voorkomen dat diepere niveaus van de conforme structuren worden ingevoerd, en vervolgens de meest conforme structuur. Op deze manier zou de vlag het gemeenschappelijke marshaling/unmarshaling-gedrag afdwingen, namelijk om aflopend te voorkomen in diepere niveaus van conforme structuren.
De tweede pas voor complexe structuren met conforme matrices werkt als volgt: de complexe structuren werken op de gebruikelijke manier; wat betekent dat diepere niveaus nooit hun conforme grootte of hun conforme matrices zouden bekijken of overslaan, en hun leden liever zouden laten lopen zonder de matrix aan te raken.
Voor complexe structuren met conforme structuren moet de conforme structuur zich bewust zijn of deze het hoogste niveau is en of deze zich in een complexe structuur bevindt. Het platte gedeelte van de matrix wordt verwerkt door de meest conforme structuur. Op de tweede pas slaat de meest conforme structuur het platte gedeelte over en doorloopt de aanwijzerindeling en retourneert. De meest complexe structuur slaat het platte gedeelte over en slaat ook de aanwijzerindeling over.
Het robuuste aspect van de endianness loopt
De endianness walk controleert op de gebruikelijke out-of-the-buffer voorwaarden en voert andere controles uit van een niet-gerelateerde aard. De controles die zijn gericht op gecorreleerde waarden (zoals het grootteargument versus de conforme grootte) kunnen niet worden uitgevoerd met behulp van deze stap; ze worden later uitgevoerd wanneer ze niet worden weergegeven.