#pragma pack
derleyiciye yapı elemanlarını belirli bir hizalamayla paketlemesi talimatını verir. Çoğu derleyici, bir yapı bildirdiğinizde, üyeler arasında, bellekteki uygun adreslere (genellikle türün boyutunun bir katı) hizalandıklarından emin olmak için dolgu ekler. Bu, düzgün hizalanmamış değişkenlere erişmeyle ilişkili bazı mimarilerde performans cezasını (veya açık hatayı) önler. Örneğin, 4 baytlık tamsayılar ve aşağıdaki yapı verilir:
struct Test
{
char AA;
int BB;
char CC;
};
Derleyici, yapıyı şu şekilde bellekte bırakmayı seçebilir:
| 1 | 2 | 3 | 4 |
| AA(1) | pad.................. |
| BB(1) | BB(2) | BB(3) | BB(4) |
| CC(1) | pad.................. |
ve sizeof(Test)
yalnızca 6 bayt veri içermesine rağmen 4 × 3 = 12 olur. #pragma
(Bildiğim kadarıyla) için en yaygın kullanım durumu , derleyicinin verilere dolgu eklemediğinden ve her üyenin bir öncekini izlediğinden emin olmanız gereken donanım aygıtlarıyla çalışmaktır. Bununla birlikte #pragma pack(1)
, yukarıdaki yapı şu şekilde ortaya konacaktır:
| 1 |
| AA(1) |
| BB(1) |
| BB(2) |
| BB(3) |
| BB(4) |
| CC(1) |
Ve sizeof(Test)
1 × 6 = 6 olur.
Bununla birlikte #pragma pack(2)
, yukarıdaki yapı şu şekilde ortaya konacaktır:
| 1 | 2 |
| AA(1) | pad.. |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
| CC(1) | pad.. |
Ve sizeof(Test)
2 × 4 = 8 olur.
Yapıdaki değişkenlerin sırası da önemlidir. Değişkenler aşağıdaki gibi sıralanmıştır:
struct Test
{
char AA;
char CC;
int BB;
};
ve #pragma pack(2)
yapı şu şekilde düzenlenir:
| 1 | 2 |
| AA(1) | CC(1) |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
ve sizeOf(Test)
3 × 2 = 6 olur.
#pragma
direktifler gibi bunlar da uygulama tanımlıdır.