Что такое мономорфизация с контекстом на 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);
}

Не уверен насчет этого; не могли бы вы дать ссылку на разговор? Это могло быть постороннее замечание.

Герман, возможно, придумал термин для чего-то вроде специализации шаблона, который генерирует типы / объекты, которые взаимно не связаны (неполиморфный или "мономорфный") из шаблона, который является полиморфной структурой.

Другие вопросы по тегам