#pragma pack
特定の配置で構造体メンバーをパックするようコンパイラーに指示します。ほとんどのコンパイラーは、構造体を宣言すると、メンバーの間にパディングを挿入して、メンバーがメモリ内の適切なアドレス(通常は型のサイズの倍数)に整列されるようにします。これにより、適切に位置合わせされていない変数へのアクセスに関連する一部のアーキテクチャーでのパフォーマンスの低下(または完全なエラー)が回避されます。たとえば、4バイトの整数と次の構造体が与えられたとします。
struct Test
{
char AA;
int BB;
char CC;
};
コンパイラは、次のように構造体をメモリに配置することを選択できます。
| 1 | 2 | 3 | 4 |
| AA(1) | pad.................. |
| BB(1) | BB(2) | BB(3) | BB(4) |
| CC(1) | pad.................. |
そしてsizeof(Test)
、それはデータのみの6つのバイトを含んでいても、4×3 = 12であろう。#pragma
(私の知る限り)の最も一般的な使用例は、コンパイラーがデータにパディングを挿入せず、各メンバーが前のものに従っていることを確認する必要があるハードウェアデバイスで作業する場合です。を使用する#pragma pack(1)
と、上記の構造体は次のように配置されます。
| 1 |
| AA(1) |
| BB(1) |
| BB(2) |
| BB(3) |
| BB(4) |
| CC(1) |
そしてsizeof(Test)
、1×6 = 6になります。
を使用する#pragma pack(2)
と、上記の構造体は次のように配置されます。
| 1 | 2 |
| AA(1) | pad.. |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
| CC(1) | pad.. |
そしてsizeof(Test)
、2×4 = 8になります。
構造体内の変数の順序も重要です。変数は次のように並べられます:
struct Test
{
char AA;
char CC;
int BB;
};
を使用する#pragma pack(2)
と、構造体は次のように配置されます。
| 1 | 2 |
| AA(1) | CC(1) |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
そしてsizeOf(Test)
、3×2 = 6であろう。
#pragma
ディレクティブと同様に、実装で定義されます。