__packed
このセクションの内容:
構文
データオブジェクトで使用される型属性の構文を参照してください。例外はstructまたはunion宣言でキーワードが構造型を変更するために使用されるときです。下記を参照してください。
説明
__packedキーワードを使用して、データ型に1 のデータアライメントを指定します。__packedを2つの方法で使用できます。
構造定義で
structまたはunionキーワードの前に使用するとき、構造の各メンバの最大アライメントは1に設定され、メンバ間のギャップのために必要になるものを除去します。構造宣言で
__packedキーワードも使用できますが、__packedキーワードの構造宣言を使用して、__packedキーワードなしで定義した構造型を参照することは不正になります。ほかのどの箇所で使用しても、型属性の構文規則に従っていて、その全体の型に影響します。
__packed型属性の型は__packed型属性のない型属性と同じです。違いは1のデータアライメントがあることです。1のデータアライメントがすでにある型は、__packed型属性によって影響されません。
通常のポインタを__packedへのポインタに明示的に変換することは可能ですが、その逆の変換にはキャストが必要になります。
注記
通常のアライメント以外のアライメントでそのデータ型をアクセスする場合、コードの大幅な増大と速度低下が発生する可能性があります。
ある型のアライメントおよびその型を使用して定義されるオブジェクトの制限を緩和するには、__packed または #pragma packを使用します。__packed と #pragma pack を混在させると、予期しない動作が発生することがあります。
例
/* No pad bytes in X: */
__packed struct X { char ch; int i; };
/* __packed is optional here: */
struct X * xp;
/* NOTE: no __packed: */
struct Y { char ch; int i; };
/* ERROR: Y not defined with __packed: */
__packed struct Y * yp ;
/* Member 'i' has alignment 1: */
struct Z { char ch; __packed int i; };
void Foo(struct X * xp)
{
/* Error:"int __packed *" -> "int *" not allowed: */
int * p1 = &xp->i;
/* OK: */
int __packed * p2 = &xp->i;
/* OK, char not affected */
char * p3 = &xp->ch;
}
関連項目
pack.