#pragma pack
プリプロセッサ ステートメントが何をするのか、そしてもっと重要なことに、なぜそれを使用するのかを誰かに説明してもらいたいと思いました。
私はチェックしましたMSDNページ、これはある程度の洞察を提供してくれましたが、経験のある人からのさらなる意見を聞きたいと思っていました。以前コードで見たことがあるのですが、もうどこで見たかわかりません。
ベストアンサー1
#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.................. |
は 6 バイトのデータしか含まれていないにもかかわらず、4 × 3 = 12 になりsizeof(Test)
ます。 の最も一般的な使用例は#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 となります。