通信用語の基礎知識 全国のICカードこれひとつ 戻る

__packed
辞書:電算用語の基礎知識 プログラミング仕様編 (PTPROGS)
読み:アンダースコア-アンダースコア-パックド
外語:__packed
品詞:名詞

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

目次
概要

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

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

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

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

特徴
機能

基本機能は次のとおり。

仕様上の制限

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

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

挙動

ポインター

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

__packed int *p;

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

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


構造体/共用体

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

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

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

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

[再検索] [戻る]


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