Skip to main content

IAR Embedded Workbench for Arm 9.70.x

アライメント

このセクションの内容:

すべてのCデータオブジェクトには、オブジェクトをメモリ内に記憶する方法を指定するためのアライメントが設定されています。たとえば、オブジェクトのアライメントが4の場合は、このオブジェクトは4で割り切れるアドレスに格納する必要があります。

一部のプロセッサではメモリのアクセス方法に制限があるため、アライメントのコンセプトが採用されています。

4で割り切れるアドレスにメモリ読取りが設定された場合にのみ、プロセッサが1回の命令で4バイトのメモリを読み取ることができるとします。この場合、long型の整数など、4バイトオブジェクトのアラインメントは4になります。

また、一度に2バイトしか読み取ることができないプロセッサの場合には、4 バイトのlong型整数のアライメントは2になります。

構造体のアライメントは、アライメントが最も厳密な構造体メンバと同じです。構造体およびそのメンバのアライメント要件を下げるには、#pragma pack または __packedデータ型属性を使用します。

すべてのデータ型は、それらのアライメントの倍数のサイズにする必要があります。これ以外については、アライメントの最初の要素のみ配列の要件に従って配置されることが保証されます。つまり、コンパイラが構造体の最後にパッドバイトを追加しなければならないことがあります。 パッドバイトについては、パック構造体型を参照してください。

注記

#pragma data_alignmentディレクティブを使用すると、特定の変数のアライメント要件を上げることができます。

標準Cファイルstdalign.hも参照してください。

Arm コアのアライメント

データオブジェクトのアライメントは、データオブジェクトがメモリでどのように格納されるかを制御します。アライメントを使用する理由は、4バイトオブジェクトが4で割り切れるアドレスに格納されている場合、Arm コアがより効率的に4バイトオブジェクトにアクセスできるためです。

アライメント4のオブジェクトは、4で割り切れるアドレスに格納する必要があり、アライメント2のオブジェクトは、2で割り切れるアドレスに格納する必要があります。

コンパイラでは、すべてのデータ型のアライメントを割り当てることで、このようなデータの配置を保証し、Armコアが確実にデータを読み取ることができるようにしています。

関連情報については、‑‑align_sp_on_irq‑‑no_const_alignを参照してください。