-zalign は、構造体メンバーのマッピングに影響します。z/OS の構造体マッピング ルールは、構造体メンバーの整列要件に関してコンパイラ挿入のパッド バイトを最小限に抑えるために「シフトして整列」アルゴリズムを使用します。これは、「構造体」のトピックに記載されている、言語間の互換性を実現するために他の UNIX および Windows のコンパイラと互換性のある、Open PL/I のデフォルトの構造体マッピング ルールとは異なります。
-zalign を使用すると、次の項目が暗黙指定されます。
構造体レイアウトの例 (Open PL/I のデフォルト)
以下に、サイズが 8 バイトの構造体 ST を示します。メンバー「C」はオフセット 0 (バイト整列) で、メンバー「X」はオフセット 4 (ワード整列) です。メンバー間にはコンパイラ挿入のパッド バイトが 3 バイトあります。
1
2 dcl 1 ST,
3 2 C CHAR,
4 2 X FIXED BIN(31);
5
NAME CLASS SIZE LOCATION ATTRIBUTES
ST BASED 8 LEVEL 1 STRUCTURE
C MEMBER 1 00000000 LEVEL 2 CHAR(1)
3 00000001 -pad-
X MEMBER 4 00000004 LEVEL 2 FIXED BIN(31,0)
構造体レイアウトの例 (-zalign)
以下に、サイズが 5 バイトの構造体 ST を示します (メモリ内で 8 バイトが割り当てられています)。メンバー「C」はオフセット 0 (バイト整列) で、メンバー「X」はオフセット 1 (ワード整列) です。この例では、要求された境界にメンバーを適切に整列させ、コンパイラ挿入のバイトを最小化する (この場合はなくす) ために、各メンバーが 3 バイトだけシフトされています (次に示すように、OFFSET=3)。実際に「シフトして整列」アルゴリズムは、構造体の先頭に向かってメンバー間の自然な整列のギャップを埋めるパッド バイトを伝播します。構造体の外側にシフトされたパッド バイト (つまり最初のメンバーよりも先行する) は、「ハング バイト」と呼ばれます。
1
2 dcl 1 ST,
3 2 C CHAR,
4 2 X FIXED BIN(31);
5
NAME CLASS SIZE LOCATION ATTRIBUTES
ST BASED 5 LEVEL 1 STRUCTURE OFFSET=3
C MEMBER 1 00000000 LEVEL 2 CHAR(1) UNALIGNED
X MEMBER 4 00000001 LEVEL 2 FIXED BIN(31,0)