10.97 #pragma pack(n)

このプラグマを使用すると、構造体のメンバの境界が n と自然境界整列の小さい方の値で整列されます。パックされたオブジェクトの読み出しと書き込みは、非境界整列アクセスを使用して行われます。

このプラグマは、ARM コンパイラがサポートする GNU コンパイラの拡張機能です。

構文

#pragma pack( n )
各項目には以下の意味があります。
n
バイト単位の境界整列です。有効な境界整列値は 124、および 8 です。

デフォルト

デフォルトは #pragma pack(8) です。

エラー

#pragma pack を用いた struct のフィールドのアドレスを取得しても、__packed ポインタは生成されないため、このアドレスを __packed 以外のポインタに割り当てた場合、コンパイラはエラーを生成しません。ただし、フィールドはその型に対して適切に整列されず、動作が定義されない非境界整列のポインタを逆参照する可能性があります。

この例では、pack(2) によって整数変数 b が 2 バイト境界で整列される方法を示します。
typedef struct
{ 
    char a;
    int b;
} S;
#pragma pack(2)
typedef struct
{ 
    char a;
    int b;
} SP;
S var = { 0x11, 0x44444444 };
SP pvar = { 0x11, 0x44444444 };
S のレイアウトは次のようになります。
図 10-1 非パック構造体 S
この図を表示するには、ご使用のブラウザが SVG 形式をサポートしている必要があります。ネイティブでサポートしているブラウザをインストールするか、次のような適切なプラグインをインストールします。Adobe SVG Viewer。.

SP のレイアウトは次のようになります。
図 10-2 パック構造体 SP
この図を表示するには、ご使用のブラウザが SVG 形式をサポートしている必要があります。ネイティブでサポートしているブラウザをインストールするか、次のような適切なプラグインをインストールします。Adobe SVG Viewer。.

このレイアウトでは、x は 1 バイトのパディングを表します。
SP は 6 バイト構造体です。b の後にパディングはありません。
関連する概念
5.35 C および C++ コードでの __packed 修飾子と非境界整列型のデータアクセス
5.40 パックされていない struct、__packed struct、個々の __packed フィールドを使用した struct の比較と、__packed struct と #pragma でパックされた struct の比較
関連する参考文書
10.68 __attribute__((packed)) 変数属性
10.60 __attribute__((packed)) 型属性
10.12 __packed
11.4 ARM C および C++ での構造体、共用体、列挙型、ビットフィールド
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.