pack pragma

Yapı, birleşim ve sınıf üyeleri için paketleme hizalamasını belirtir.

Sözdizimi

#pragma pack( show )
#pragma pack( push [ ,identifier ] [ ,n ] )
#pragma pack( pop [ , { identifier | n } ] )
#pragma pack( [ n ] )

Parametreler

show
(İsteğe bağlı) Paketleme hizalaması için geçerli bayt değerini görüntüler. Değer bir uyarı iletisiyle görüntülenir.

push
(İsteğe bağlı) İç derleyici yığınında geçerli paketleme hizalama değerini iter ve geçerli paketleme hizalama değerini n olarak ayarlar. n belirtilmezse, geçerli paketleme hizalama değeri gönderiliyordur.

pop
(İsteğe bağlı) İç derleyici yığınının üst kısmından kaydı kaldırır. ile n belirtilmezsepop, yığının en üstündeki sonuçta elde edilen kayıtla ilişkili paketleme değeri, yeni paketleme hizalama değeridir. Örneğin, n belirtilirse, #pragma pack(pop, 16)n yeni paketleme hizalama değeri olur. örneğin, kullanarak identifieraçılırsanız, #pragma pack(pop, r1)yığındaki tüm kayıtlar bulunana identifier kadar açılır. Bu kayıt çıkarılır ve yığının en üstünde bulunan kayıtla ilişkili paketleme değeri yeni paketleme hizalama değeri olur. Yığındaki herhangi bir kayıtta bulunmayan bir identifier kullanarak açılırsa , pop yoksayılır.

deyimi #pragma pack (pop, r1, 2) ile eşdeğerdir #pragma pack (pop, r1) ve ardından öğesini izler #pragma pack(2).

identifier
(İsteğe bağlı) ile pushkullanıldığında, iç derleyici yığınındaki kayda bir ad atar. ile popkullanıldığında, kaldırılana kadar identifier kayıtları iç yığından açar. İç yığında bulunamazsa identifier hiçbir şey gösterilmez.

n
(İsteğe bağlı) Paketleme için kullanılacak değeri bayt cinsinden belirtir. Derleyici seçeneği /Zp modül için ayarlı değilse için varsayılan değer n 8'dir. Geçerli değerler 1, 2, 4, 8 ve 16'dır. Bir üyenin hizalaması, öğesinin katı nveya üye boyutunun katları olan bir sınırdadır (hangisi daha küçükse).

Açıklamalar

Bir sınıfı paketlemek, üyelerini bellekte doğrudan birbirinin arkasına yerleştirmektir. Bu, üyelerin bazılarının veya tümünün hedef mimarinin varsayılan hizalamasından daha küçük bir sınıra hizalanabileceği anlamına gelebilir. pack veri bildirimi düzeyinde denetim sağlar. Yalnızca modül düzeyinde denetim sağlayan derleyici seçeneğinden /Zpfarklıdır. paketi , görüldükten sonra ilk struct, unionveya class bildiriminde pragma etkinleşir. pack tanımlar üzerinde hiçbir etkisi yoktur. Derleyici seçeneğinde /Zpayarlanan değere bağımsız değişken kümesi n olmadan çağırmapack. Derleyici seçeneği ayarlı değilse, x86, ARM ve ARM64 için varsayılan değer 8'dir. x64 yerel ve ARM64EC için varsayılan değer 16'dır.

Bir yapının hizalamasını değiştirirseniz, bellekte o kadar fazla alan kullanmayabilir. Ancak, performans kaybıyla karşılaşabilir ve hatta hizalanmamış erişim için donanım tarafından oluşturulan bir özel durum alabilirsiniz. kullanarak SetErrorModebu özel durum davranışını değiştirebilirsiniz.

Hizalamayı değiştirme hakkında daha fazla bilgi için şu makalelere bakın:

  • alignof

  • align

  • __unaligned

  • x64 yapı hizalama örnekleri

    Uyarı

    Visual Studio 2015 ve sonraki sürümlerde, __alignof derleyiciler arasında taşınabilir olan standart alignas ve alignof__declspec( align ) işleçleri kullanabilirsiniz. C++ standardı paketlemeyi ele almaz, bu nedenle hedef mimarinin sözcük boyutundan daha küçük hizalamaları belirtmek için yine de (veya diğer derleyicilerde ilgili uzantıyı) kullanmanız pack gerekir.

Örnekler

Aşağıdaki örnekte, bir yapının hizalamasını değiştirmek için öğesinin nasıl kullanılacağı packpragma gösterilmektedir.

// pragma_directives_pack.cpp
#include <stddef.h>
#include <stdio.h>

struct S {
   int i;   // size 4
   short j;   // size 2
   double k;   // size 8
};

#pragma pack(2)
struct T {
   int i;
   short j;
   double k;
};

int main() {
   printf("%zu ", offsetof(S, i));
   printf("%zu ", offsetof(S, j));
   printf("%zu\n", offsetof(S, k));

   printf("%zu ", offsetof(T, i));
   printf("%zu ", offsetof(T, j));
   printf("%zu\n", offsetof(T, k));
}
0 4 8
0 4 6

Aşağıdaki örnek gönderme, pop ve show söz diziminin nasıl kullanılacağını gösterir.

// pragma_directives_pack_2.cpp
// compile with: /W1 /c
#pragma pack()   // n defaults to 8; equivalent to /Zp8
#pragma pack(show)   // C4810
#pragma pack(4)   // n = 4
#pragma pack(show)   // C4810
#pragma pack(push, r1, 16)   // n = 16, pushed to stack
#pragma pack(show)   // C4810

// pop to the identifier and then set
// the value of the current packing alignment:
#pragma pack(pop, r1, 2)   // n = 2 , stack popped
#pragma pack(show)   // C4810

Ayrıca bkz.

Pragma yönergeleri ve __pragma ve _Pragma anahtar sözcükleri