Udostępnij za pośrednictwem


Układ wskaźnika

Układ wskaźnika opisuje wskaźniki struktury lub tablicy.

pointer_layout<>

Pole pointer_layout<> składa się z znaków formatu FC_PP FC_PAD, po którym następuje co najmniej jeden opis wskaźnika, zgodnie z opisem w dalszej części, i kończy się znakiem formatu FC_END:

FC_PP
FC_PAD
{ pointer_instance_layout<> }*
FC_END

Pole pointer_instance_layout<> to ciąg formatu opisujący pojedyncze lub wiele wystąpień wskaźników. Następujące pola są używane w tych deskryptorach:

  • offset_in_memory

    Podpisane przesunięcie do lokalizacji wskaźnika w pamięci. W przypadku wskaźnika znajdującego się w strukturze przesunięcie to ujemne przesunięcie od końca struktury (koniec niekonformantnej części zgodnych struktur); dla tablic przesunięcie jest od początku tablicy.

  • offset_in_buffer

    Podpisane przesunięcie do lokalizacji wskaźnika w buforze. W przypadku wskaźnika znajdującego się w strukturze przesunięcie to ujemne przesunięcie od końca struktury (koniec niekonformantnej części zgodnych struktur): dla tablic przesunięcie jest od początku tablicy.

  • offset_to_array

    Przesunięcie z otaczającej struktury do tablicy osadzonej, której wskaźniki są obsługiwane. W przypadku tablic najwyższego poziomu to pole zawsze będzie zerowe.

  • Iteracji

    Całkowita liczba wskaźników, które mają ten sam układ<> opisany.

  • wzrost

    Inkrementacja między kolejnymi wskaźnikami podczas powtarzania.

  • number_of_pointers

    Liczba różnych wskaźników w wystąpieniu powtórzenia.

  • pointer_description

    Opis wskaźnika.

Wszystkie układy wystąpień wskaźnika używają następujących pojedynczych pointer_instance<8>:

offset_to_pointer_in_memory<2> 
offset_to_pointer_in_buffer<2> 
pointer_description<4>

Poniżej przedstawiono deskryptory wystąpień:

pojedyncze wystąpienie wskaźnika do prostego typu:

FC_NO_REPEAT FC_PAD 
pointer_instance<8>

Stały wskaźnik powtarzania:

FC_FIXED_REPEAT FC_PAD 
iterations<2> 
increment<2> 
offset_to_array<2> 
number_of_pointers<2>
{ pointer_instance<8> }*

wskaźnik powtarzania zmiennej :

FC_VARIABLE_REPEAT (FC_FIXED_OFFSET | FC_VARIABLE_OFFSET) 
increment<2> 
offset_to_array<2> 
number_of_pointers<2> 
{ pointer_instance<8> }*

W przypadku stałych wystąpień wskaźnika powtarzania i zmiennej istnieje zestaw opisów przesunięcia i wskaźnika dla każdego wskaźnika w wystąpieniu powtórzenia.

Problemy z projektowaniem układu wskaźników

W tej sekcji rozwiązano problemy związane z przetwarzaniem zgodnych struktur i osadzonych wskaźników. Problem polega na tym, że kompilator generuje układy wskaźników dla struktur i tablic z pewną nadmiarowością. Jest to korzystne, ponieważ informacje są przydatne, a na przykład zgodna struktura może przechodzić jeden układ wskaźnika do obsługi wszystkich wskaźników ze struktury i ze zgodnej tablicy będącej częścią zgodnej struktury. Istnieją jednak pewne osadzone sytuacje, które wymagają, aby aparat NDR wykonał dodatkową pracę w celu przetworzenia wszystkich układów wskaźników w odpowiedniej sekwencji, przetwarzania każdego wskaźnika dokładnie raz.

Co generuje kompilator

Każdy obiekt omówiony w tej sekcji zawiera wskaźniki, więc na przykład zgodna struktura zawiera wskaźniki w części struktury, a także w elementach tablicy. Element jest prostą strukturą ze wskaźnikiem.

  1. Struktura zgodna, pojedynczy poziom

    Zgodny deskryptor ma część PP, w której opisano wszystkie wskaźniki, zarówno ze struktury, jak i z tablicy. Lista elementów członkowskich ma FC_LONG zamiast wskaźnika. Deskryptor tablicy CARRAY ma elementy przy użyciu embedded_complex i w ogóle nie deskryptorów wskaźników. Element nadal ma deskryptor pojedynczego wskaźnika. Układ wskaźnika poprzedza układ elementu członkowskiego w zgodnej strukturze i prostych deskryptorach struktury.

  2. Zgodna struktura, co najmniej dwa poziomy

    Opis PP zawiera wskaźniki ze wszystkich poziomów. Ponownie używa tego samego opisu tablicy co wewnętrzna struktura zgodna. Lista elementów członkowskich ma FC_LONG zamiast wskaźnika. Osadzona struktura jest używana przez osadzony kompleks. Deskryptor struktury zgodnej jest ponownie używany as-is. Rozmiar płaskiej części struktury również jest kompletny, co oznacza, że rozmiar struktury najwyższego poziomu będzie obejmował płaski rozmiar struktury osadzonej.

  3. Złożona struktura, pojedynczy poziom

    Elementy członkowskie wskaźnika są oznaczone przez FC_POINTER. Układ wskaźnika jest uproszczony w taki sposób, że istnieje deskryptor wskaźnika (4 bajty) dla każdego wpisu FC_POINTER na liście. Układ wskaźnika jest przechodzi równolegle z przewodnikiem składowym, czyli FC_POINTER powoduje przetworzenie następnego opisu wskaźnika. Tablica CARRAY ma układ wskaźnika ze wszystkimi deskryptorami tablicy, a następnie elementem za pomocą osadzonego złożonego zestawu. Deskryptor elementu jest ponownie używany. Rozmiar płaskiej części struktury jest kompletny; innymi słowy, płaski rozmiar struktury najwyższego poziomu obejmuje płaski rozmiar osadzonej struktury. Układ składowy poprzedza układ wskaźnika dla złożonych struktur.

    W związku z tym generowanie zgodnego opisu tablicy różni się w zależności od tego, czy jest to tablica wewnątrz zgodnej struktury, czy wewnątrz złożonej struktury.

  4. Złożona struktura, 2 lub więcej poziomów, złożona w złożonych

    Złożona struktura najwyższego poziomu ma wskaźniki składowe, osadzona złożona struktura ma wskaźniki składowe. Deskryptor struktury zgodnej jest ponownie używany. Deskryptor tablicy od góry jest ponownie użytą tablicą z osadzonej struktury.

  5. Złożona struktura z osadzoną zgodną strukturą

    Struktura zgodna najwyższego poziomu ma wskaźniki składowe. Deskryptor struktury zgodnej jest ponownie używany as-is. Deskryptor tablicy jest ponownie używany z osadzonej struktury zgodnej; innymi słowy, nie ma żadnych wskaźników w deskryptorze tablicy. Element ma deskryptor wskaźnika.

  6. Tablice struktur ze wskaźnikami

    Tablica prostych struktur ze wskaźnikami jest generowana jako SMFARRAY lub CARRAY w zależności od tego, czy tablica ma rozmiar, ale w obu przypadkach ma kompletny układ wskaźnika (FIXED_REPEAT lub VARIABLE_REPEAT). Układ wskaźnika jest przed układem elementu członkowskiego.

    Tablica złożonych struktur ze wskaźnikami jest generowana jako BOGUS_ARRAY niezależnie od tego, czy jest stała, czy ma rozmiar, a w obu przypadkach nie ma żadnego układu wskaźnika.

Co robi aparat NDR

W tej sekcji opisano zachowanie aparatu NDR.

przepustka marshalingowa

  1. Zgodne struktury i osadzona struktura zgodna.

    Struktura najwyższego poziomu zachowuje się jak struktura pojedynczego poziomu.

  2. Osadzona złożona struktura ze zgodną tablicą

    Każda złożona struktura wymusza zewnętrzną strukturę jako złożoną strukturę. Osadzona struktura nigdy nie marshaluje tablicy. Każda struktura zawsze przechodzi przez osadzone wskaźniki, po prostu marshaling elementów członkowskich i elementu członkowskiego dzieje się FC_POINTER.

  3. Złożona struktura ze zgodną strukturą

    Najbardziej osadzona struktura zgodna z topem marshaluje zgodną tablicę i wszystkie wskaźniki. Aparat NDR nigdy nie schodzi do bardziej zagnieżdżonych struktur zgodnych, jeśli istnieją; Upraszcza to rozwiązanie, ponieważ zgodna struktura jest obiektem liścia w zakresie marshalingu obiektów osadzonych. Złożona struktura najwyższego poziomu pomija marshaling tablicy.

Unmarshaling, bufsizing i zwalnianie przechodzi

Unmarshaling jest symetryczny do marshalingu; Pierwszą operacją wykonywaną dla złożonych struktur jest znalezienie lokalizacji punktów w buforze za pomocą wywołania funkcji NdrComplexStructBufferSize. Następnie równoczesne odsłania wskaźniki, włączając ten sam schemat w celu prawidłowego stosowania wskaźników. Nie powinno być wątpliwości co do wielkości obiektów i związków; obraz pamięci nie powinien być używany dla obiektów o rozmiarze i związkach, tylko dla zawartości buforu.

Flagi używane do przeprowadzania marshalingu i prawidłowego rozwikłania są używane w taki sam sposób w bufsizing i uwolnieniu, aby upewnić się, że wskaźniki są chodzine dokładnie raz.

endianness — przekazywanie

Na początku pass endianness jest nieco podobny do marshaling/unmarshaling; Dwa przebiegi są wymagane do przetwarzania złożonych struktur. Pierwsza pass konwertuje płaską część i znajduje lokalizację punktów w buforze podobnym do sposobu wykonywania tej operacji w celu unmarshaling. Drugi pass następnie konwertuje wskaźniki.

Endianness przechodzi różni się w następujący sposób: każda struktura i każdy element członkowski musi być schodkowany, dopóki składowa lub element liścia nie jest prostym typem. Różni się to od niezamężnego; na przykład w unmarshaling nigdy nie ma potrzeby przetwarzania zgodnych struktur osadzonych w zgodnych strukturach lub żadnego elementu członkowskiego zgodnej struktury, w tym przypadku. Innym problemem jest to, że konwersja nie jest operacją idempotentną — dlatego niemarszczący pass może ponownie rozwikłać niektóre elementy bez szkody, podczas gdy konwersja musi być wykonywana ściśle raz na każdy prosty typ.

W związku z tym algorytm endianness można podsumować w następujący sposób. NDR ma pojęcie struktury zgodnej najwyższego poziomu i flagi, aby to oznaczyć odpowiednio. Podczas chodzenia po raz pierwszy, takich jak przekonwertowanie płaskiej części i uzyskanie lokalizacji punktów, to pojęcie nie byłoby używane. NDR zstąpi przez płaskie części wszystkich poziomów struktur i nigdy nie zawróć do przetwarzania wskaźnika. Na koniec NDR będzie płasko przekonwertować tablicę na najwyższym poziomie.

Podczas chodzenia po raz drugi flaga będzie używana do oznaczania przejścia osadzonego wskaźnika, aby uniknąć wprowadzania głębszych poziomów zgodnych struktur, a następnie najbardziej zgodnej struktury. W ten sposób flaga wymusiłaby wspólne działanie marshalingu/unmarshaling, co polega na unikaniu malenia na głębszych poziomach zgodnych struktur.

Drugie przejście dla złożonych struktur ze zgodnymi tablicami działa w następujący sposób: złożone struktury działają w typowy sposób; oznacza to, że głębsze poziomy nigdy nie będą patrzeć na ich zgodny rozmiar lub zgodne tablice, i raczej po prostu chodzić ich składowe bez dotykania tablicy.

W przypadku złożonych struktur ze strukturami zgodnymi struktura zgodna musi być świadoma, czy jest najwyższego poziomu i czy znajduje się w złożonej strukturze. Płaska część tablicy jest przetwarzana przez najbardziej zgodną strukturę. W drugim przebiegu najbardziej zgodna struktura pomija płaską część i przechodzi przez układ wskaźnika i zwraca. Najbardziej złożona struktura pomijałaby płaską część, a także pomijała układ wskaźnika.

Solidny aspekt endianness idzie

Endianness walk sprawdza zwykłe warunki poza buforem i wykonuje inne kontrole niekorzysty natury. Nie można wykonać testów mających na celu skorelowane wartości (takie jak argument rozmiaru a zgodny rozmiar) przy użyciu tego kroku; są one wykonywane później, gdy rozwikłanie.