#pragma pack
menginstruksikan kompiler untuk mengemas anggota struktur dengan penyelarasan tertentu. Sebagian besar kompiler, ketika Anda mendeklarasikan struct, akan menyisipkan bantalan di antara anggota untuk memastikan bahwa mereka disejajarkan dengan alamat yang sesuai dalam memori (biasanya kelipatan dari ukuran tipe). Ini menghindari penalti kinerja (atau kesalahan langsung) pada beberapa arsitektur yang terkait dengan mengakses variabel yang tidak selaras dengan benar. Misalnya, diberikan bilangan bulat 4-byte dan struct berikut:
struct Test
{
char AA;
int BB;
char CC;
};
Kompiler dapat memilih untuk meletakkan struct di memori seperti ini:
| 1 | 2 | 3 | 4 |
| AA(1) | pad.................. |
| BB(1) | BB(2) | BB(3) | BB(4) |
| CC(1) | pad.................. |
dan sizeof(Test)
akan menjadi 4 × 3 = 12, meskipun hanya berisi 6 byte data. Kasus penggunaan yang paling umum untuk #pragma
(sepengetahuan saya) adalah ketika bekerja dengan perangkat perangkat keras di mana Anda perlu memastikan bahwa kompiler tidak memasukkan bantalan ke dalam data dan setiap anggota mengikuti yang sebelumnya. Dengan #pragma pack(1)
, struct di atas akan ditata seperti ini:
| 1 |
| AA(1) |
| BB(1) |
| BB(2) |
| BB(3) |
| BB(4) |
| CC(1) |
Dan sizeof(Test)
akan menjadi 1 × 6 = 6.
Dengan #pragma pack(2)
, struct di atas akan ditata seperti ini:
| 1 | 2 |
| AA(1) | pad.. |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
| CC(1) | pad.. |
Dan sizeof(Test)
akan menjadi 2 × 4 = 8.
Urutan variabel dalam struct juga penting. Dengan variabel yang dipesan seperti berikut:
struct Test
{
char AA;
char CC;
int BB;
};
dan dengan #pragma pack(2)
, struct akan ditata seperti ini:
| 1 | 2 |
| AA(1) | CC(1) |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
dan sizeOf(Test)
akan menjadi 3 × 2 = 6.
#pragma
arahan mereka didefinisikan implementasi.