配列、構造体、および UNION

デフォルトでは、ほとんどの PL/I データは ALIGNED です。デフォルトでは、IBM 互換性コンパイラ オプションのある文字列データは UNALIGNED です。CHAR VARYING データは、ALIGNED 属性を指定しない限り整列されません。通常、整列されたデータの方がパフォーマンスは高くなります。

コンパイラによるパディング バイトの挿入を許可しないことを推奨します。コンパイラ オプション -map を使用してコンパイラ リストを作成します。リストで、コンパイラ挿入のパディング バイトを示す -pad- を探します。そして、コンパイラがパディング バイトを追加できないように、データ構造体を設計できます。

64 ビット モードで既存の 32 ビット設計プログラムをコンパイルしている場合、32 ビット コンパイル プログラムでは取得しなかったパディングを取得する可能性が、非常に高くなります。これが発生する原因は、以前は 4 バイト境界で整列されていた POINTER が、現在は 8 バイト境界で整列されるようになったことです。通常、特に注意する必要はありませんが、この追加パディングとそれによる構造体のサイズの変化は認識しておく必要があります。

この変化は、他の前提に影響する可能性があり、それが結果としてパフォーマンスに影響することも考えられます。次に例を示します。

DCL 1 LIST, 2 next ptr, 2 f fixed bin(31), 2 prev ptr, 2 data char(16);

SIZE(LIST) は、32 ビット システム上では (パディングが無い状態で) 28 ですが、64 ビット システム上では 40 (8 + 4 + 4 バイト パッド + 8 + 16) です。

UNION は、like 型または un-like 型のデータをオーバーレイする最も効率的な方法です。次に例を示します。

DCL 1 st, 3 * union, 
                     5 binval fixed bin(15), 
                     5 *, 
                         7 hi_char char(1), 
                         7 lo_char char(1);

これは、以下のものより効率的です。

DCL binval fixed bin(15);
DCL 1 st based(addr(binval)),
                         7 hi_char char(1), 
                         7 lo_char char(1);