Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Мономорфизация и размер бинарного файла

// Copyright 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];

    // первый экземпляр, &Vec<u32> -> ()
    print_vec(&ints);
    // второй экземпляр, &Vec<f32> -> ()
    print_vec(&floats);
}
  • Каждый экземпляр функции или типа с обобщёнными параметрами на этапе компиляции превращается в уникальную конкретную версию этой функции. Обобщений во время выполнения не существует, есть только конкретные типы.

  • Это даёт высокую базовую производительность и возможности для оптимизации, но ценой размера бинарного файла и времени компиляции.

  • Есть много способов уменьшить размер бинарного файла и время компиляции, но здесь мы их рассматривать не будем.

  • Платите за то, что используете: рост размера бинарного файла из-за мономорфизации возникает только для экземпляров типов или функций над типами, которые используются в итоговой программе или динамической библиотеке.

  • Когда это важно: мономорфизация влияет на время компиляции и размер бинарного файла. В таких случаях, как WebAssembly в браузере или разработка встраиваемых систем, при проектировании с обобщениями стоит об этом помнить.