Aracılığıyla paylaş


C-Derleyici Paketleme Sorunları

Paketleme düzeyleri hem MIDL hem de Microsoft C/C++ derleyicisi için bellek düzenini aynı şekilde etkiler. VC++ veya Platform Yazılım Geliştirme Seti (SDK) tarafından tanımlanan derleme ortamı gibi Microsoft derleme ortamlarında MIDL ve C/C++ derleyicileri için varsayılan paketleme düzeyi aynıdır; 32 bit ve 64 bit Windows derleme ortamları için varsayılan paketleme düzeyi 8'dir.

Doğal Hizalama

Bellekteki türler için varsayılan hizalama, doğal hizalamasıyla aynıdır.

  • Kısa, kayan ve __int64 gibi bir temel tür ve gösterimi boyutu modüle edilmiş bir adreste başlıyorsa işaretçi doğal olarak hizalanır. Şu anda desteklenen tüm temel türler 1, 2, 4 veya 8 boyutlarına sahiptir. İşaretçilerin boyutu 32 bit ortamlarda 4, 64 bit ortamlarda 8 olur.
  • Bileşenlerin her biri türün başlangıcına göre doğal olarak hizalanmışsa ve bileşenler arasında gereksiz boşluklar (doldurma) yoksa bileşik tür doğal olarak hizalanır. Alanlar veya öğeler gibi bileşik bileşenler, işaretçi veya temel tür bileşenlerine yeniden işlenir.

Bu davranışı hatırlamaya yardımcı olacak basit bir kural, bir türün doğal hizalamasının bileşenlerinin en büyük hizalamalarına eşit olmasıdır.

C veya C++ ve IDL gibi dillerdeki bir türün hizalama ve bellek boyutu arasında, sizeof() işleci tarafından ifade edilen bir bağlantı vardır. Boyut, hizalamanın bir katıdır (türü kapsayan en küçük kat). Bu, bellekteki bir dizi gösteriminden kaynaklanmaktadır.

Yanlış hizalanmış verilere erişmek bazı sistemlerde özel duruma neden olabileceği için doğal hizalama önemlidir. Veriler yanlış hizalandığında güvenli bir işleme için işaretlenebilir, ancak genellikle bazı platformlarda önemli olabilecek bir hız cezası içerir.

Not

Bellekte, doğal hizalaması n olan tür nesnelerinin, nkatı olan adreslere yerleştirildiğinde düzgün hizalanması garanti edilir.

 

Paketleme ve Hizalama karşılaştırması

Bir türün doğal hizalamasından daha büyük bir paketleme düzeyi belirtmek, tür hizalamasını değiştirmez. Doğal hizalamadan daha küçük bir paketleme düzeyi belirtmek, tür hizalamasını paketleme düzeyine düşürür. Sonuç olarak, paketlenmiş türler yanlış hizalamaya neden olmadan paketleme düzeyinin katı olan adreslere (azaltılmış hizalama) belleğe yerleştirilebilir. Bu, hem basit türleri hem de bileşen türlerini etkiler. Bileşik türler için, bileşenlerin azaltılmış hizalaması bileşenlerin düzgün hizalaması için gereken doldurma boyutunu değiştirebileceği için türün iç düzeni etkilenebilir ve bu nedenle türün boyutunu küçültür.

Paketlenmiş bir tür için yeni hizalamanın, paketleme düzeyi ile doğal hizalama arasından daha küçük olanı olduğu basit bir kural, bu davranışı hatırlamaya yardımcı olabilir. Yazı tipi boyutu, yeni hizalamanın bir katıdır. sizeof() işleci paketlenmiş türler için küçültülmüş boyutu döndürür.

Örneğin, paketleme düzeyi 2 ile bir uzun 2'de hizalanır ve bu nedenle yalnızca 4'ün katı olan adreslerde değil, aynı zamanda doğal hizalamada olduğu gibi herhangi bir çift adrese yerleştirilebilir. Kısa ve uzun, 2'de paketlenmiş bir yapı, doğal hizalama için gerekli olan kısa ve ardından gelen uzun arasındaki iç boşluğa ihtiyaç duymaz; bu nedenle, yapı artık yalnızca 2'de hizalanmış olmakla kalmıyor, aynı zamanda boyutu da 8'den 6'ya düşürülmüştür.

Örneğin, 1 baytlık karakter, 4 bayt uzunluğunda bir tamsayı ve 1 bayt karakterden oluşan bileşik bir tür düşünün:

struct mystructtype 
{    
    char c1;  /* requires 1 byte  */
              /* 3 bytes of padding with natural alignment only */
    long l2;  /* requires 4 bytes */
    char c3;  /* requires 1 byte  */
              /* 3 bytes of padding with natural alignment only */
 } mystruct;

Bu yapı 4'te doğal olarak hizalanır ve 12'lik doğal boyuta sahiptir.

Paketleme seviyesi 4 veya üzeri olduğunda, yapısı, 4 olarak hizalanır ve sizeof(struct mystructtype) 12'ye eşittir. Bellekte 4'ün katı olmayan bir adreste bulunursa yapı yanlış hizalanır.

Paketleme düzeyi 2 için, yapı 2'ye hizalanır ve boyutu 8'dir. Düzey 2 ile paketlenmiş yapı, bellekte 2'nin katı olmayan bir adreste bulunuyorsa yanlış hizalanır.

Paketleme düzeyi 1 için yapı 1'e hizalanır ve boyutu 6'dır. Düzey 1 ile paketlenmiş yapı, yanlış hizalama hatasına neden olmadan herhangi bir yere yerleştirilebilir.

/Zp

/paket