単相化とバイナリサイズ

// 著作権 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn print_vec<T: std::fmt::Debug>(debug_vec: &Vec<T>) {
    for item in debug_vec {
        println!("{:?}", item);
    }
}

fn main() {
    let ints = vec![1u32, 2, 3];
    let floats = vec![1.1f32, 2.2, 3.3];

    // 1つ目のインスタンス、&Vec<u32> -> ()
    print_vec(&ints);
    // 2つ目のインスタンス、&Vec<f32> -> ()
    print_vec(&floats);
}
  • ジェネリクスを持つ関数や型の各インスタンスは、コンパイル時に一意で 具体的なバージョンへと変換されます。ジェネリクスは実行時には存在せず、 あるのは具体的な型だけです。

  • これにより、高い基本性能と最適化のしやすさが得られますが、その代償として バイナリサイズとコンパイル時間が増加します。

  • バイナリサイズやコンパイル時間を削減する方法は数多くありますが、ここでは それらは扱いません。

  • 使った分だけ支払う: 単相化によるバイナリサイズの増加が発生するのは、 最終的なプログラムまたは動的ライブラリで使われる型のインスタンス化や、 その型に対する関数についてのみです。

  • 気にすべき場面: 単相化はコンパイル時間とバイナリサイズに影響します。 ブラウザ内で動く WebAssembly や組み込みシステム開発のような状況では、 ジェネリクスを前提にした設計を意識したほうがよいかもしれません。