C および C++ コードでの非境界整列ポインタ

デフォルトで、コンパイラは、従来の C および C++ ポインタによって参照される対象が、自然な境界で整列されたメモリ内のワードであると見なます。この方がコンパイラは効率的なコードを生成できるためです。

任意のアドレスにあるワードを参照できるポインタを定義するには、ポインタを定義するときに、__packed 修飾子を指定する必要があります。以下に例を示します。

 __packed int *pi; // 非境界整列型 int へのポインタ

ポインタが __packed として宣言されている場合、コンパイラは、ポインタの境界整列にかかわらず、ポインタのデリファレンス値に正しくアクセスするためのコードを生成します。生成されたコードは、一連のバイトアクセスで構成されるか、単純な LDR 命令ではなく変数の境界整列に依存するシフト命令とマスク命令で構成されます。その結果、ポインタを __packed として宣言すると、パフォーマンスが低下するだけでなく、コードサイズも増大します。

Show/hide関連項目

参照

『コンパイラリファレンス』

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0472EJ
Non-ConfidentialID081711