10.60 __attribute__((packed)) 型属性

packed 型属性を使用すると、その型に可能な最小アラインメントを使用するように指定できます。

この型属性は、ARM コンパイラがサポートしている GNU コンパイラの拡張機能です。
非 GNU モードでは、この属性は __packed と同等で、GNU モードで使用した場合よりも強力な制約があります。

GNU モード

GNU モードを有効にするには、--gnu オプションを使用して下さい。
GNU モードでは、__attribute__((packed)) には #pragma packed と同じ効果があります。__attribute__((packed)) で修飾されたフィールドのアドレスを取得しても、__packed 修飾ポインタは生成されません。
非 GNU モードでは、__attribute__((packed)) には __packed と同じ効果があります。__attribute__((packed)) で修飾されたフィールドのアドレスを取得すると、__packed 修飾ポインタが生成されます。
struct foobar {
  char x;
  short y[10] __attribute__((packed));
};

short get_y0(struct foobar *s){
    return *s->y;  // 非境界整列が可能な負荷
}

short *get_y(struct foobar *s){
    return s->y;   // --gnu を使用しない限りコンパイルエラーが発生。
}

エラー

packed 属性付きのフィールドまたは packed 属性付きの構造体のフィールドのアドレスを取得すると、__packed で修飾されたポインタが生成されます。このポインタを非 __packed ポインタに暗黙的にキャストしようとすると、コンパイラによってタイプエラーが生成されます。これは、#pragma pack を用いた構造体のアドレス取得済みフィールドの動作とは対照的です。
この属性を typedef で使用すると、ARM コンパイラは警告メッセージを生成します。
関連する概念
5.35 C および C++ コードでの __packed 修飾子と非境界整列型のデータアクセス
5.40 パックされていない struct、__packed struct、個々の __packed フィールドを使用した struct の比較と、__packed struct と #pragma でパックされた struct の比較
関連する参考文書
8.92 --gnu
10.68 __attribute__((packed)) 変数属性
10.97 #pragma pack(n)
10.12 __packed
11.4 ARM C および C++ での構造体、共用体、列挙型、ビットフィールド
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.