Aracılığıyla paylaş


İşaretçi Düzeni

İşaretçi düzeni, bir yapının veya dizinin işaretçilerini açıklar.

pointer_layout<>

pointer_layout<> alanı, daha sonra açıklandığı gibi FC_PP FC_PAD biçim karakterlerinden ve ardından bir veya daha fazla işaretçi açıklamasından oluşur ve FC_END biçim karakteriyle sonlandırılır:

FC_PP
FC_PAD
{ pointer_instance_layout<> }*
FC_END

pointer_instance_layout<> alanı, işaretçilerin tek veya birden çok örneğini açıklayan bir biçim dizesidir. Bu tanımlayıcılarda aşağıdaki alanlar kullanılır:

  • offset_in_memory

    İşaretçinin bellekteki konumuna işaretli uzaklık. Bir yapıda bulunan bir işaretçi için, bu uzaklık yapının sonundan (uyumlu yapıların uygunsuz kısmının sonu) negatif bir uzaklıktır; diziler için uzaklık dizinin başındandır.

  • offset_in_buffer

    İşaretçinin arabellekteki konumuna işaretli uzaklık. Bir yapıda bulunan bir işaretçi için, bu uzaklık yapının sonundan (uyumlu yapıların uygunsuz kısmının sonu) negatif bir uzaklıktır: diziler için uzaklık dizinin başındandır.

  • offset_to_array

    Kapalı bir yapıdan işaretçileri işlenen ekli diziye uzaklık. Üst düzey diziler için bu alan her zaman sıfır olur.

  • Yineleme

    Açıklanan<> aynı düzene sahip olan işaretçilerin toplam sayısı.

  • artım

    REPEAT sırasında ardışık işaretçiler arasında artış.

  • number_of_pointers

    Yineleme örneğindeki farklı işaretçilerin sayısı.

  • pointer_description

    İşaretçi açıklaması.

Tüm işaretçi örneği düzenleri aşağıdaki tek pointer_instance<8>kullanır:

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

Örnek tanımlayıcıları şunlardır:

Basit bir türe işaretçinin tek örneği:

FC_NO_REPEAT FC_PAD 
pointer_instance<8>

Düzeltildi yineleme işaretçisi:

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

değişken yineleme işaretçisini :

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

Sabit yineleme ve değişken yineleme işaretçisi örnekleri için yineleme örneğindeki her işaretçi için bir uzaklık ve işaretçi açıklamaları kümesi vardır.

İşaretçi Düzeni Tasarım Sorunları

Bu bölümde uyumlu yapıları ve eklenmiş işaretçileri işlemeyle ilgili sorunlar ele alınıyor. Sorun, derleyicinin bazı yedekliliklere sahip yapılar ve diziler için işaretçi düzenleri oluşturmasıdır. Bilgiler yararlı olduğundan ve örneğin uyumlu bir yapı, yapıdan ve uyumlu yapının parçası olan uyumlu diziden gelen tüm işaretçilere hizmet vermek için tek bir işaretçi düzenine yürüyebilir. Ancak, NDR altyapısının tüm işaretçi düzenlerini doğru sırada işlemek için ek iş gerçekleştirmesini gerektiren bazı katıştırılmış durumlar vardır ve her işaretçi tam olarak bir kez işlenir.

DerleyiciNin Oluşturduğu

Bu bölümde açıklanan her nesnenin işaretçileri vardır, bu nedenle, örneğin, uyumlu bir yapı hem yapı bölümünde hem de dizi öğelerinde işaretçilere sahiptir. öğesi, işaretçisi olan basit bir yapıdır.

  1. Uyumlu yapı, tek düzey

    Uyumlu tanımlayıcı, hem yapıdan hem de diziden tüm işaretçilerin açıklandığı bir PP bölümüne sahiptir. Üye listesinde işaretçi yerine FC_LONG vardır. CARRAY dizi tanımlayıcısı, bir embedded_complex kullanımı aracılığıyla öğelere sahiptir ve hiçbir işaretçi tanımlayıcısı yoktur. öğesinin tek işaretçi tanımlayıcısı hala vardır. İşaretçi düzeni, üye düzeninin önüne uyumlu bir yapı ve basit yapı tanımlayıcıları ekler.

  2. Uyumlu yapı, iki veya daha fazla düzey

    PP açıklamasında tüm düzeylerden işaretçiler bulunur. İç uyumlu yapıyla aynı dizi açıklamasını yeniden kullanır. Üye listesinde işaretçi yerine FC_LONG vardır. Katıştırılmış bir yapı, katıştırılmış bir karmaşık kullanımıyla gelir. Uyumlu yapı tanımlayıcısı as-isyeniden kullanılır. Yapının düz kısmının boyutu da eksiksiz olarak ortaya çıkar, yani üst düzey yapı boyutu katıştırılmış yapının düz boyutunu içerir.

  3. Karmaşık yapı, tek düzey

    İşaretçi üyeleri FC_POINTER tarafından işaretlenir. İşaretçi düzeni, listedeki her FC_POINTER girişi için bir işaretçi tanımlayıcısı (4 bayt) olacak şekilde basitleştirilir. İşaretçi düzeni bir üye yürüyüşüyle paralel olarak izlendiğinden, bir FC_POINTER sonraki işaretçi açıklamasının işlenmesine neden olur. CARRAY dizisi, ekli bir karmaşık kullanımı aracılığıyla dizinin tüm tanımlayıcılarıyla ve ardından öğesiyle birlikte işaretçi düzenine sahiptir. Öğe tanımlayıcısı yeniden kullanılır. Yapının düz kısmının boyutu tamamlanmış olarak ortaya çıkar; başka bir deyişle, üst düzey yapının düz boyutu katıştırılmış yapının düz boyutunu içerir. Üye düzeni, karmaşık yapılar için işaretçi düzeninden önce gelen düzendir.

    Bu nedenle, uyumlu dizi açıklaması oluşturma, uyumlu bir yapının içindeki veya karmaşık bir yapının içindeki bir dizi olmasına bağlı olarak farklıdır.

  4. Karmaşık yapı, 2 veya daha fazla düzey, karmaşık karmaşık

    Üst düzey karmaşık yapının üye işaretçileri, katıştırılmış karmaşık yapının üye işaretçileri vardır. Uyumlu yapı tanımlayıcısı yeniden kullanılır. Üstten dizi tanımlayıcısı, katıştırılmış yapıdan yeniden kullanılan dizidir.

  5. Katıştırılmış uyumlu yapıya sahip karmaşık yapı

    Top=level conformant structure has its member pointers. Uyumlu yapı tanımlayıcısı as-isyeniden kullanılır. Dizi tanımlayıcısı, katıştırılmış uyumlu yapıdan yeniden kullanılır; başka bir deyişle, dizi tanımlayıcısında herhangi bir işaretçisi yoktur. öğesinin işaretçi tanımlayıcısı vardır.

  6. İşaretçileri olan yapı dizileri

    İşaretçileri olan basit yapılar dizisi, dizinin boyutlandırılıp boyutlandırılmadığına bağlı olarak SMFARRAY veya CARRAY olarak oluşturulur, ancak her iki durumda da tamamlanmış bir işaretçi düzenine sahiptir (FIXED_REPEAT veya VARIABLE_REPEAT). İşaretçi düzeni üye düzeninden önce gelir.

    sabit veya boyutlandırılmış olmasına bakılmaksızın, işaretçileri olan karmaşık yapılar dizisi BOGUS_ARRAY olarak oluşturulur ve her iki durumda da herhangi bir işaretçi düzeni yoktur.

NDR Altyapısı Ne Yapar?

Bu bölümde NDR altyapısı davranışı açıklanmaktadır.

Hazırlama geçişi

  1. Uyumlu yapılar ve gömülü uyumlu yapı.

    Üst düzey yapı, tek düzeyli bir yapı gibi davranır.

  2. Uyumlu dizi ile tümleşik karmaşık yapı

    Herhangi bir karmaşık yapı dış yapıyı karmaşık bir yapıya zorlar. Katıştırılmış yapı hiçbir zaman dizisini hazırlamaz. Her yapı, üyeleri ve bir üyenin FC_POINTER olmasını sağlayarak her zaman katıştırılmış işaretçilerden geçer.

  3. Uyumlu yapıya sahip karmaşık yapı

    En üstteki gömülü uyumlu yapı, uyumlu diziyi ve tüm noktaları sıralar. NDR altyapısı, varsa hiçbir zaman daha derin iç içe uyumlu yapılara inemez; bu, uyumlu bir yapı, katıştırılmış nesnelerin hazırlaması söz konusu olduğunda yaprak bir nesne olduğundan çözümü basitleştirir. Üst düzey karmaşık yapı, dizi hazırlamayı atlar.

Unmarshaling, bufsizing ve freeing passs

Özetleme, hazırlama için simetriktir; karmaşık yapılar için gerçekleştirdiği ilk işlem, NdrComplexStructBufferSize işlevini çağırarak arabellekteki noktaların konumunu bulmaktır. Daha sonra işaret işaretlerini paralel olarak kaldırarak, aynı düzenin işaret işaretlerini doğru bir şekilde kullanılması için kaldırmasını sağlar. Boyutlandırılmış nesneler ve birleşimler konusunda karışıklık olmamalıdır; bellek görüntüsü, yalnızca arabellek içeriği için boyutlandırılmış nesneler ve birleşimler için kullanılmamalıdır.

Sıralamayı ve özetlemeyi doğru şekilde gerçekleştirmek için kullanılan bayraklar, noktalı işaretlerin tam olarak bir kez yüründüğünden emin olmak için fıstırma ve serbestleştirmede aynı şekilde kullanılır.

Endianness pass

İlk başta, endianness geçişi sıralamaya/özetlenmeye benzer; karmaşık yapıları işlemek için iki geçiş gereklidir. İlk geçiş düz kısmı dönüştürür ve arabellekteki noktaların konumunu, bufizing'ın özetleme için bu işlemi gerçekleştirmesine benzer şekilde bulur. İkinci pas daha sonra noktaları dönüştürür.

Endianness geçişleri aşağıdaki şekilde farklılık gösterir: yaprak üye veya öğe basit bir tür olana kadar her yapıya ve her üyeye basılması gerekir. Bu, özetlemeden farklıdır; örneğin, uyumsuz yapılara veya uyumlu yapının herhangi bir üyesine gömülü uyumlu yapıları işlemeye gerek yoktur. Başka bir sorun, dönüştürmenin bir kez etkili bir işlem olmamasıdır; bu nedenle özetlenmeyen geçiş, bazı parçaların özetlenmesini zarar vermeden tekrarlayabilirken, dönüştürmenin kesinlikle her basit türde bir kez gerçekleştirilmesi gerekir.

Bu nedenle, endianness algoritması aşağıdaki gibi özetlenebilir. NDR' nin en üst düzey uyumlu yapı ve bunu uygun şekilde işaretlemek için bir bayrağı vardır. Düz kısmı dönüştürmek ve sivri noktaların konumunu elde etmek gibi ilk kez yürürken, bu fikir kullanılmayacaktı. NDR, tüm yapı düzeylerinin düz bölümlerinden iner ve işaretçi işlemeye asla girişemez. Son olarak NDR, diziyi düz bir şekilde en üst düzeye dönüştürür.

İkinci kez yürürken, uyumlu yapıların daha derin düzeylerine, sonra en üst uyumlu yapıya girmemek için ekli işaretçinin geçişini işaretlemek için bayrak kullanılır. Bu şekilde, bayrak ortak sıralama/özetlemeden kaldırma davranışını zorlar ve bu da daha derin uyumlu yapı düzeylerine inmeyi önlemektir.

Uyumlu dizilere sahip karmaşık yapılar için ikinci geçiş şu şekilde çalışır: karmaşık yapılar ortak şekilde çalışır; bu, daha derin düzeylerin hiçbir zaman uyumlu boyutlarına veya uyumlu dizilerine bakmadığı veya atlamadığı ve diziye dokunmadan üyelerini gezdirmeyi tercih ettiği anlamına gelir.

Uyumlu yapılara sahip karmaşık yapılar için, uyumlu yapının üst düzey olup olmadığını ve karmaşık bir yapıda olup olmadığının farkında olması gerekir. Dizinin düz kısmı en üst uyumlu yapı tarafından işlenir. İkinci geçişte, en üstteki uyumlu yapı düz kısmı atlar ve işaretçi düzeninden geçer ve geri döner. En üstteki karmaşık yapı düz bölümünü atlar ve işaretçi düzenini de atlar.

Bitişin sağlam yönü

Endianness walk her zamanki arabellek dışı koşulları denetler ve bağıntısız bir doğaya ilişkin diğer denetimleri gerçekleştirir. Bağıntılı değerleri hedefleyen denetimler (boyutlandırma bağımsız değişkeni ile uyumlu boyut gibi) bu adım kullanılarak gerçekleştirilemez; daha sonra, özetleme kaldırıldığında gerçekleştirilir.