__packed

読み:アンダースコア・アンダースコア・パックド
外語:__packed 英語
品詞:名詞

いくつかのC/C++の独自実装による予約語の一つで、型修飾子。境界整列が1であることを表わす。

目次

バウンダリの制限がある場合、ワード以上のものが奇数アドレスに配置されそうになった場合、コンパイラーはその場所に無意味なデータを置き、奇数を避ける。

このためメモリー上の配置が、プログラムの記述と一致しなくなる。

これが困る場合の対策としてコンパイラーは様々な方法を用意しているが、そのうちの方法の一例が、この__packedである。他には#pragmaで設定する実装もある。

一般的には、構造体ポインターなどに利用できる。

機能

基本機能は次のとおり。

  • 境界整列を1とし、境界整列させるためのパディングの挿入を実行しない

    構造体または共用体に__packedを指定した場合、全メンバーに対して__packed修飾子が適用される。メンバー間にも構造体の終わりにも、パディングは挿入されない。

  • 該当のオブジェクトに対する読み書きアクセスは、一般に効率が落ちる

    非境界整列アクセスに対応していないプロセッサーの場合、そのまま奇数アドレスにアクセスするとアドレスエラーとなるため、可能なサイズで分割してアクセスして合成するような処理が使われることになる。したがって、コードサイズ、実効速度面では、__packedを使うメリットはない。

仕様上の制限

構造体や共用体に使用した場合、使用していない構造体との代入互換性がない。これは、使用されるメモリーの配列(メモリーレイアウト)が異なるためである。

もしパック構造体を非パック構造体に代入したい場合は、フィールドごとに個別にコピーする必要がある。

挙動

ポインター

__packed修飾子を付けたポインターである。

__packed int *p;

通常、int型のポインターは4の倍数などアラインメントが考慮された位置に配列され、それを前提として、コンパイラーは効率的な命令を出力する。たとえばARMであれば、LDR命令でこれを読み取ることが可能である。

しかしこの配置が4の倍数でない場合、LDR命令では正しく読み取れない。そこで、「このポインターはアラインされているとは限らない」ことを明示するために__packedを付けて定義する。コンパイラーは、LDRBなど複数の命令を組み合わせて正しくメモリーを読み取るコードを出力する。このため、効率は大幅に悪化する。

構造体/共用体

__packed修飾子を付けた構造体や共用体である。例えば、次のように定義されたものをいう。

__packed struct mystruct
{
    char c;
    short s;
};

通常、ARMなどの環境ではcの後とsの後に、それぞれパディングが挿入され、アラインメントされる。__packedを指定することで、この機能を停止する。

関連する用語
バウンダリ
パディング

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club