単態化(monomorphization)
ジェネリクス(総称型)を実装する方式のひとつ。コンパイル時に、ジェネリックなコード(関数・構造体など)を実際に使われている具体型の組み合わせごとに複製し、型ごとに専用の機械語を生成する。
C++のテンプレート、Rustのジェネリクスがこの方式を採用している。対になる方式が辞書渡しで、両者はGoのジェネリクス実装(GC Shape Stenciling)が解決しようとした「Generic Dilemma」の両極をなす。
利点
- 型ごとに専用コードが生成されるため、実行時の間接参照(辞書引き・vtable経由の呼び出しなど)が発生せず、実行速度が速い。
- インライン化・定数畳み込みなど、コンパイラの最適化が型固有の情報を活かして効きやすい。
欠点
- 使われる型の組み合わせの数だけコードが複製されるため、バイナリサイズが肥大化しやすい。
- 型のネストが深い場合(ジェネリック型を引数に持つジェネリック関数など)、複製されるコード量が指数的に増えるおそれがある。
- コンパイル時間が伸びる。
ジェネリクスの実装方式の中での位置づけ
辞書渡しと対をなす、もう一方の極として位置づけられる。