ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
いくつかのC/C++の独自実装による予約語の一つで、型修飾子。境界整列が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を指定することで、この機能を停止する。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます