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

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

デフォルトで、コンパイラは、従来の C および C++ ポインタによって参照される対象が、自然な境界で整列されたメモリ内のワードであると見なします。この方がコンパイラは効率的なコードを生成できるためです。
たとえば、以下のように非境界整列ポインタを指定します。
__packed int *pi; // 非境界整列型 int へのポインタ
ポインタが __packed として宣言されている場合、コンパイラは、ポインタの境界整列にかかわらず、ポインタのデリファレンス値に正しくアクセスするためのコードを生成します。生成されたコードは、一連のバイトアクセスで構成されるか、単純な LDR 命令ではなく変数の境界整列に依存するシフト命令とマスク命令で構成されます。その結果、ポインタを __packed として宣言すると、パフォーマンスが低下するだけでなく、コードサイズも増大します。
関連する概念
5.39 コンパイラによって生成される非境界整列型レジスタロード(LDR)命令
関連する参考文書
10.12 __packed
8.187 --unaligned_access、--no_unaligned_access
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.