1. 導入:動的メモリ管理の重要性
メインフレームのPL/I開発において、データのサイズが事前に決まっていない「可変長データ」を扱う場面は非常に多いです。固定長で大きなメモリを確保し続けるとシステムリソースを無駄に消費してしまいます。そこで重要になるのが、必要な分だけメモリを確保する「動的メモリ割り当て」です。今回は、ALLOCATE文でREFER句を使用してメモリサイズをスマートに制御する手法を解説します。
2. 基礎知識:REFER句とポインタの役割
PL/Iにおける REFER句 は、構造体の中にある可変長部分の長さを、別の変数の値に基づいて動的に決定するために使用されます。
ポインタ(Pointer) は、メモリ上の特定の場所を指し示すアドレスを保持する変数です。SET(P) を指定することで、確保したメモリ領域の先頭アドレスをポインタ変数Pに格納し、そのアドレスを通じてデータにアクセスできるようになります。これは、現代のJavaにおけるリストの初期化や、C#の配列生成に相当する、非常に効率的なメモリ管理手法です。
3. 実装と解決策
動的メモリを確保する際は、以下のステップを踏みます。
1. 構造体定義でREFER句を使用して可変長項目を宣言する。
2. 確保直前に、サイズを保持する変数に値をセットする。
3. ALLOCATE文を実行し、SET句でポインタ変数にアドレスを渡す。
これにより、プログラムは実行時に決定された正確なバイト数だけをヒープから確保し、無駄のないメモリ利用を実現します。
4. サンプルプログラム
以下のコードは、可変長項目を持つ構造体を動的に確保する例です。そのままコピーしてロジックの参考にしてください。
/ 可変長構造体の定義 /
DCL 1 DYN_STRUCT BASED(P),
2 DATA_LEN FIXED BIN(15), / サイズ保持用変数 /
2 DATA_CONTENT CHAR(1000) REFER(DATA_LEN); / DATA_LENの値に応じて長さを決定 /
DCL P POINTER; / メモリ位置を保持するポインタ /
DCL N_SIZE FIXED BIN(15) INIT(100); / 確保したいサイズを指定 /
/ 確保の実行 /
DATA_LEN = N_SIZE; / REFER変数をセット /
ALLOCATE DYN_STRUCT SET(P); / 指定したサイズでメモリを確保 /
/ メモリの利用例 /
SUBSTR(DYN_STRUCT.DATA_CONTENT, 1, N_SIZE) = ‘データ書き込み’;
/ 使用後は必ず解放する /
FREE DYN_STRUCT;
5. 応用・注意点:現場での運用Tips
現場でこのテクニックを使う際、最も注意すべきは「FREE文の実行漏れ」です。動的に確保したメモリは、不要になった時点で必ずFREE文で解放する必要があります。これを怠ると「メモリリーク」が発生し、オンライン処理の長時間稼働でシステムが停止する原因になります。
また、現代の言語へ移行する際は、このREFER変数を「コレクションの初期化パラメータ」と読み替えるのがコツです。メモリを確保する直前の「サイズ計算ロジック」を関数化しておくと、言語移行時にロジックの移植が非常にスムーズになります。ぜひ実践してみてください。

コメント