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 identifier
açı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 push
kullanıldığında, iç derleyici yığınındaki kayda bir ad atar. ile pop
kullanı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ı n
veya ü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 /Zp
farklıdır. paketi , görüldükten sonra ilk struct
, union
veya class
bildiriminde pragma etkinleşir. pack
tanımlar üzerinde hiçbir etkisi yoktur. Derleyici seçeneğinde /Zp
ayarlanan 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 SetErrorMode
bu özel durum davranışını değiştirebilirsiniz.
Hizalamayı değiştirme hakkında daha fazla bilgi için şu makalelere bakın:
-
Uyarı
Visual Studio 2015 ve sonraki sürümlerde,
__alignof
derleyiciler arasında taşınabilir olan standartalignas
vealignof
__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ızpack
gerekir.
Örnekler
Aşağıdaki örnekte, bir yapının hizalamasını değiştirmek için öğesinin nasıl kullanılacağı pack
pragma 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