5.36 構造体に含まれる非境界整列型フィールド

__packed 修飾子を使用すると、構造体内に非境界整列型フィールドを作成できます。これにより、コンパイラはデータ自身と同じサイズの境界になるようにフィールドをパッドする必要がないため、メモリ空間を節約できます。

効率性を高めるため、構造体内のフィールドは、データ自身と同じサイズの境界上に配置されます。そのため、多くの場合、コンパイラでは、フィールドを自然な境界で整列するために、フィールド間にパディングが挿入されます。
容量が重視される場合は、__packed 修飾子を使用して、フィールド間にパディングが挿入されていない構造体を作成できます。構造体は次の方法でパックできます。
  • struct 全体を __packed として宣言できます。以下に例を示します。
    __packed struct mystruct
    {
        char c;
        short s;
    } // 推奨されない宣言
    
    構造体の各フィールドは、__packed 修飾子を継承します。
    通常、 struct 全体を __packed として宣言すると、コードサイズが増大するだけでなく、パフォーマンスも低下します。
  • struct 内の個々の非境界整列型フィールドは、__packed として宣言できます。以下に例を示します。
    struct mystruct
    {
        char c;
        __packed short s; // 推奨される宣言
    }
    
    これは、構造体をパックする際に推奨される方法です。

同じ原則が共用体にも当てはまります。共用体全体を __packed として宣言するか、__packed 属性を使用すると、メモリ内で境界整列されていない共用体の要素を識別できます。
関連する参考文書
10.12 __packed
10.97 #pragma pack(n)
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.