IT TIP

C ++에 대한 컨텍스트의 단일화 란 무엇입니까?

itqueen 2020. 12. 15. 20:37
반응형

C ++에 대한 컨텍스트의 단일화 란 무엇입니까?


Rust에서 Dave Herman의 최근 강연 은이 속성을 C ++에서 빌렸다 고 말했습니다. 주제와 관련하여 아무것도 찾을 수 없습니다. 누군가 단형 화가 무엇을 의미하는지 설명해 주시겠습니까?


Monomorphization은 일반 함수의 특수 버전을 생성하는 것을 의미합니다. 한 쌍의 첫 번째 요소를 추출하는 함수를 작성하면 :

fn first<A, B>(pair: (A, B)) -> A {
    let (a, b) = pair;
    return a;
}

그런 다음이 함수를 두 번 호출합니다.

first((1, 2));
first(("a", "b"));

컴파일러는 first()정수 쌍에 특화된 버전 과 문자열 쌍에 특화된 버전의 두 가지 버전을 생성 합니다.

이 이름은 여러 유형의 데이터를 처리 할 수있는 하나의 함수를 의미하는 프로그래밍 언어 용어 "다형성"에서 파생되었습니다. 단형 화는 다형에서 단형 코드로의 변환입니다.


누군가가 여전히 이것을보고 있는지 확실하지 않지만 Rust 문서는 실제로이 프로세스를 통해 비용 추상화를 달성하지 못하는 방법을 언급합니다. 에서 코드 제네릭을 사용하여 성능 :

일반 유형 매개 변수를 사용할 때 런타임 비용이 있는지 궁금 할 수 있습니다. 좋은 소식은 Rust가 제네릭을 구현하여 코드가 구체적인 유형보다 제네릭 유형을 사용하여 느리게 실행되지 않도록한다는 것입니다.

Rust는 컴파일 타임에 제네릭을 사용하는 코드의 단일화를 수행하여이를 수행합니다. Monomorphization은 컴파일 할 때 사용되는 구체적인 유형을 채워 일반 코드를 특정 코드로 바꾸는 프로세스입니다.

이 프로세스에서 컴파일러는 Listing 10-5에서 일반 함수를 생성하는 데 사용한 단계와 반대로 수행합니다. 컴파일러는 일반 코드가 호출되는 모든 위치를 살펴보고 일반 코드가 호출되는 구체적인 유형에 대한 코드를 생성합니다. .

표준 라이브러리의 Option enum을 사용하는 예제를 통해 이것이 어떻게 작동하는지 살펴 보겠습니다.

let integer = Some(5);
let float = Some(5.0);

Rust가이 코드를 컴파일 할 때 단일 형태를 수행합니다. 이 과정에서 컴파일러는 Option 인스턴스에서 사용 된 값을 읽고 두 종류의 Option을 식별합니다. 하나는 i32이고 다른 하나는 f64입니다. 따라서 Option의 일반 정의를 Option_i32 및 Option_f64로 확장하여 일반 정의를 특정 정의로 대체합니다.

코드의 단일 형태 버전은 다음과 같습니다. 일반 옵션은 컴파일러에서 만든 특정 정의로 대체됩니다.

// Filename: 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);
}

Rust는 제네릭 코드를 각 인스턴스의 유형을 지정하는 코드로 컴파일하기 때문에 제네릭 사용에 대한 런타임 비용을 지불하지 않습니다. 코드가 실행되면 각 정의를 수동으로 복제 한 것처럼 수행됩니다. 단일화 과정은 Rust의 제네릭을 런타임에 매우 효율적으로 만듭니다.


이것에 대해 확실하지 않습니다. 이야기에 연결할 수 있습니까? 엉뚱한 발언이었을 수도 있습니다.

Herman은 다형성 구조 인 템플릿에서 상호 관련이없는 (다형성이 아닌 또는 "단형") 유형 / 객체를 생성하는 템플릿 전문화와 같은 용어를 만들었을 수 있습니다.

참조 URL : https://stackoverflow.com/questions/14189604/what-is-monomorphisation-with-context-to-c

반응형