データ構造サブフィールドの位置合わせ
サブフィールドの位置合わせが必要な場合があります。 場合によっては、それが自動的に行われることがありますが、手操作で行わ なければならないこともあります。
たとえば、長さ表記法を使用し、基底ポインターまたはプロシージャー・ポイン ター・タイプのサブフィールドを定義している場合には、コンパイラーが必要に 応じて埋め込みを行うので、サブフィールドは確実に正しく位置合わせされます。
浮動、
整数、または符号なしサブフィールドを定義している場合には、
実行時のパフォーマンスを改善するために位置合わせが
必要になる場合があります。 長さ表記法を使用してサブフィールドを定義する場合には、
データ構造定義にキーワード ALIGN を
指定することによって、浮動、整数または符号なしサブフィールド
を自動的に位置合わせすることができます。 ただし、以下の例外に注意してください。
- ファイル情報データ構造またはプログラム状況データ構造の場合には、 ALIGN キーワードを使用することはできません。
- キーワード OVERLAY を使用して定義されたサブフィールドは、データ構造に キーワード ALIGN が指定されていても、自動的には位置合わせされ ません。 この場合には、サブフィールドを手操作で位置合わせすることが必要です。
自動位置合わせでは、フィールドが次の境界で位置合わせされることになります。
- 5 桁の整数または符号なしサブフィールドの場合は 2 バイト
- 10 桁の整数または符号なしサブフィールドの場合または 4 バイト の浮動サブフィールドの場合は 4 バイト
- 20 桁の整数または符号なしサブフィールドの場合は 8 バイト
- 8 バイトの浮動サブフィールドの場合は 8 バイト
- ポインター・サブフィールドの場合は 16 バイト
フィールドを手操作で位置合わせしている場合には、それらが同じ境界で位置合わせ されることを確認してください。 ((桁 - 1) mod n) = 0 の 場合には、開始位置は n バイト境界にあります。("x mod y" の値は、 整数算術で x を y で除算した余りです。これは、X DIV Y の後の MVR 値と同じです。)
図 1 は、一連のバイトを示し、位置合わせに使用される種々の 境界を表しています。
図 1. データ位置合わせの境界

上のバイト順序については、次の点に注意してください。
- ((1-1) mod 16) = 0 であるので、1 桁目は 16 バイト境界上にあります。
- ((13-1) mod 4) = 0 であるので、13 桁目は 4 バイト境界上にあります。
- ((7-1) mod 4) = 2 であるので、7 桁目は 4 バイト境界上にありません。