Что такое мономорфизация с контекстом на C++?
В недавнем выступлении Дейва Германа в Rust говорится, что они заимствовали это свойство из C++. Я не мог найти ничего вокруг темы. Может кто-нибудь объяснить, что означает мономорфизация?
3 ответа
Мономорфизация означает создание специализированных версий обобщенных функций. Если я напишу функцию, которая извлекает первый элемент любой пары:
fn first<A, B>(pair: (A, B)) -> A {
let (a, b) = pair;
return a;
}
и затем я вызываю эту функцию дважды:
first((1, 2));
first(("a", "b"));
Компилятор сгенерирует две версии first()
один специализируется на пары целых чисел, а другой - на пары строк.
Название происходит от термина языка полиморфизма, означающего одну функцию, которая может работать со многими типами данных. Мономорфизация - это преобразование из полиморфного в мономорфный код.
Не уверен, что кто-то все еще смотрит на это, но документация о ржавчине на самом деле упоминает, как это не приводит к снижению затрат через этот процесс:
https://doc.rust-lang.org/book/2018-edition/ch10-01-syntax.html
В книге Rust есть хорошее объяснение мономорфизации
Мономорфизация - это процесс превращения общего кода в конкретный код путем заполнения конкретных типов, которые используются при компиляции.
Из примера книги, если вы определили переменные с помощью Some
:
let integer = Some(5); let float = Some(5.0);
Когда Rust компилирует этот код, он выполняет мономорфизацию. Во время этого процесса компилятор считывает значения, которые использовались в
Option<T>
экземпляров и определяет два видаOption<T>
: одинi32
а другойf64
. Таким образом, он расширяет общее определениеOption<T>
вOption_i32
а такжеOption_f64
, тем самым заменяя общее определение конкретным.Мономорфизированная версия кода выглядит следующим образом. Общий
Option<T>
заменяется конкретными определениями, созданными компилятором:Имя файла: src / main.rs
enum Option_i32 { Some(i32), None, } enum Option_f64 { Some(f64), None, } fn main() { let integer = Option_i32::Some(5); let float = Option_f64::Some(5.0); }
Не уверен насчет этого; не могли бы вы дать ссылку на разговор? Это могло быть постороннее замечание.
Герман, возможно, придумал термин для чего-то вроде специализации шаблона, который генерирует типы / объекты, которые взаимно не связаны (неполиморфный или "мономорфный") из шаблона, который является полиморфной структурой.