2017-02-03 7 views
1

함수가 호출되지 않으면 템플릿 함수가 LLVM-IR에 표시되지 않는 이유는 llvm에있는 다른 유형의 함수 (int, float ...)와는 달리 C 코드에서 LLVM IR을 방출 할 때 IR 예 : LLVM의 IR에 다음 기능 func1 나던 쇼왜 템플릿 기능이 LLVM-IR에 나타나지 않습니까?

template <class tmp> 
tmp func1() { 
    // ... 
} 

그러나이 기능 func2 항상 LLVM의 IR에 표시

int func2() { 
    // ... 
} 
+1

* 템플릿 기능 *이 아닙니다. 이것은 * 함수 템플릿 *입니다. 그것은 기능이 아니라 미래 기능의 청사진입니다. 그것은 완전히 중요하지 않습니다.'func '은 * 템플릿 함수 *, 즉 모든 템플릿 매개 변수가 이미 알려진 * 함수 템플릿 *이됩니다. 이 * 템플릿을 인스턴스화하여 "materialize"합니다. – AnT

답변

5

이 일 수있다 왜냐하면 템플릿은 기능이 아니기 때문에 기능 템플릿입니다. 그들은 인수로 인스턴스화 될 때까지 결과물이 아닙니다. 예를 들어 다음 코드를 사용하십시오.

template<typename T> 
T foo() { /* ... */ } 

코드를 출력하지 않으며 출력하지 않습니다.

그러나 다른 한편으로는이 :

template<typename T> 
T foo() { /* ... */ } 

int test() { 
    return foo<int>(); 
} 

윌 출력 testfoo<int> 모두에 대한 코드입니다. 이 how C++ templates work과 관련이있다

template int foo<int>(); 
4

:

수동과 같은 템플릿을 인스턴스화 할 수 있습니다. 컴파일러는 함수를 호출 할 때까지 (또는 더 정확하게 인스턴스를 생성 할 때까지) tmp이 무엇인지 모르기 때문에 코드를 작성하는 방법을 알지 못합니다. T는, 정수 다음 함수 본문은 정수 추가하는 경우

template <typename T> 
T add(T left, T right) { 
    return left + right; 
} 

예를 들어,이 템플릿을 고려하십시오. T이 double이면 부동 소수점 추가입니다. Tstd::string 인 경우 std::string::operator+에 대한 함수 호출입니다.

C++ 프로그램에는 많은 유형이 있으므로 그 중 많은 유형을 추가 할 수 있으며 거의 ​​모든 유형이 다른 방식으로 추가됩니다.이 유형을 알기 전까지는 함수의 코드를 작성할 수 없습니다. 가능한 모든 유형 T에 대해이를 수행하려고 시도하면 가능한 구현의 조합 폭발이 발생합니다. 거의 대부분이 사용되지 않습니다. 컴파일 타임과 바이너리 크기가 크다면 이익은 크지 않을 것입니다.


class templates의 경우 다소 복잡합니다. 클래스 템플릿의 인스턴스화는 실제로 호출되지 않으면 모든 함수를 인스턴스화 할 필요가 없습니다. 우리가 대신 쓴 경우, 예제로 돌아 간다 : 컴파일러가 add<int> 잠재적으로 흥미 알고있는 모든 정보를 가지고 있더라도 실제로 을하지 않기 때문에

template <typename T> 
class Adder { 
    T add(T left, T right) { 
     return left + right; 
    } 
}; 

Adder<int> a; 

여전히Adder<int>::add을 인스턴스화 할 것을 호출하거나 인스턴스화합니다.