Weak

このページは最後に更新されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

last mod. 2009-09-10 (木) 14:22:12

Chapter 20 標準ライブラリ

module Weak: sig .. end

ウィークポインタの配列とウィークポインタのハッシュテーブルです。


Low-level functions

type 'a t

ウィークポインタの配列の型です (ウィーク配列) 。ウィークポインタとは、他の部分(ノーマルポインタ)かから使われていないとき、 ガベージコレクタに消されうる値のことです。。 ファイナライズ関数は、ウィークポインタが消された後に実行されます。 ウィークポインタは値を示しているとき full であるといい、その値が GC に消されていたら empty であるといいます。

注意:

  • 整数はアロケートされないので、ウィーク配列に格納できません。
  • ウィーク配列は、output_valueやMarshal?モジュールの関数でマーシャリングできません。
val create : int -> 'a t

Weak.create n は長さ n のウィーク配列を新しく作って返します。 ポインタはすべて初期値 empty です。n が負だったり Sys.max_array_length-1 より大きかったりした場合は例外 Invalid_argument を発生します。

val length : 'a t -> int

Weak.length ar は ar の長さ (要素数) を返します。

val set : 'a t -> int -> 'a option -> unit

Weak.set ar n (Some el) は ar の n 番目のセルに el へのポインタをいれて full にします。Weak.set ar n None は ar の n 番目のセルを empty にします。 n が 0 から Weak.length a - 1 までの範囲外だったら例外 Invalid_argument "Weak.set" を発生します。

val get : 'a t -> int -> 'a option

Weak.get ar n は ar の n 番目のセルが empty だったら None を、full だったら Some x (x はその値) を返します。 n が 0 から Weak.length a - 1 までの範囲外だったら例外 Invalid_argument "Weak.set" を発生します。

val get_copy : 'a t -> int -> 'a option

Weak.get ar n は ar の n 番目のセルが empty だったら None を、full だったら Some x (x はその値の(浅い)コピー) を返します。 書き換え可能な値の落とし穴がありますが、get と異なる面白い点は、get_copy は incremental GC が現在のサイクルで値を消去する妨げにならないということです (get は消去を次の GC サイクルに遅延させる可能性があります) 。 n が 0 から Weak.length a - 1 までの範囲外だったら例外 Invalid_argument "Weak.set" を発生します。

val check : 'a t -> int -> bool

Weak.check ar n は ar の n 番目のセルが full だったら true を、empty だったら false を返します。ただし Weak.check ar n が true を返した直後に Weak.get をしても None が返るかもしれないことに注意してください。

val fill : 'a t -> int -> int -> 'a option -> unit

Weak.fill ar ofs len el は ar の ofs 番目から ofs + len - 1 番目までのセルを el で埋めます。ofs と len が a の部分配列を示すものとして不正であった場合は例外 Invalid_argument "Weak.fill" を発生します。

val blit : 'a t -> int -> 'a t -> int -> int -> unit

Weak.blit ar1 off1 ar2 off2 len は ar1 の off1 番目から len 個のウィークポインタを ar2 の off2 番目から len 個までにコピーします。 ar1 と ar2 が同一のものであっても正常に動作します。 off1 と len が ar1 の部分配列を示すものとして不正であった場合、または off2 と len が ar2 の部分配列を示すものとして不正であった場合は例外 Invalid_argument "Weak.fill" を発生します。

Weak hash tables

ウィークハッシュテーブルはハッシュ化された値の集合です。それぞれの値は、プログラムの他でいっさい使われなくなったとき、集合から消えてしまう可能性があります。これは普通メモリリークを起こさない共有データ構造として使われます。 ウィークハッシュテーブルは Hashtbl.HashedType? モジュールの値に従って定義されます。つまりこのモジュールの equal 関数と hash 関数を利用します。equal x v が true のとき x のインスタンスが v であるといいます。 equal 関数は値の(浅い)コピーに対しても正常に動作し、元の値を与えたときと同じ結果を返さなければなりません。

module type S = sig  end

functor Weak.Make の出力 signature です。参照: Weak.S

module Make: functor (H : Hashtbl.HashedType) -> sig  end

ウィークハッシュテーブル構造の実装を束縛する functor です。参照: Weak.Make

新規 編集 添付