データ構造サブフィールドの位置合わせ

サブフィールドの位置合わせが必要な場合があります。 場合によっては、それが自動的に行われることがありますが、手操作で行わ なければならないこともあります。

たとえば、長さ表記法を使用し、基底ポインターまたはプロシージャー・ポイン ター・タイプのサブフィールドを定義している場合には、コンパイラーが必要に 応じて埋め込みを行うので、サブフィールドは確実に正しく位置合わせされます。

浮動、 整数、または符号なしサブフィールドを定義している場合には、 実行時のパフォーマンスを改善するために位置合わせが 必要になる場合があります。 長さ表記法を使用してサブフィールドを定義する場合には、 データ構造定義にキーワード 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 バイト境界上にありません