Мономорфизация и размер бинарного файла
// 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 в браузере или разработка встраиваемых систем, при проектировании с обобщениями стоит об этом помнить.