2011-03-25 1 views
6

인라인하면 어떻게 작동하는지 이해할 수 있습니다. 그러나 그렇지 않은 경우 어떻게 작동합니까? 모든 객체 파일은 예를 들어 함수 템플릿과 같은 고유 한 사본을 얻을 수 있습니까?템플릿은 어떻게 작동합니까? 템플릿은 항상 인라인됩니까?

+0

템플릿은 코드 생성 용입니다. 템플릿을 사용하면 클래스/함수가 생성되어 사용됩니다. 컴파일러는 동일한 매개 변수를 사용하여 여러 개의 템플릿 인스턴스를 제거 할 수 있지만 보장 할 수는 없습니다. 인라인 링크가 보이지 않습니다. – knivil

답변

4

템플릿 inline의 표준 의미에서 인라인 될 것이다 실제 코드 인라이닝보다 One Definition Rule과 더 관련이 있습니다. 즉, 템플릿 함수가 둘 이상의 번역 단위에 정의되어 있으면 링커에서 불평하지 않습니다. 하나만 선택합니다 (주의 : 다른 번역 단위로 다른 템플릿 정의를 제공하면 현재 컴파일러가 불평하지 않습니다!) 최종 바이너리에 두십시오.

다른 모든 inline 함수와 마찬가지로 컴파일러는 실제로 함수 호출을 피하고 호출 위치에서 함수를 인라인하는 것이 좋습니다. 그렇지 않은 경우 컴파일러는 그다지 좋지 않다고 판단 할 수 있습니다 아이디어 (큰 함수, 일부 컴파일러는 중첩 루프가있는 함수를 인라인하지 않습니다 ... 이유가 무엇이든간에) 실제 코드 인라이닝을 수행하지 않습니다.

+0

그리고 컴파일러는'inline '이라고 선언되지 않은 함수를 "인라인"하기로 결정할 수 있습니다. 'gcc '를 사용할 때 외부 링키지가없는 함수에서이 점을 발견했습니다. – Raedwald

1

구현에 따라 다릅니다.

그러나 공통점은 각 객체 파일이 사용하는 각 확장 함수의 복사본을 가져옵니다. 그런 다음 링커가 링크 타임에이를 확인하고 함수의 복사본 하나만 최종 실행 파일에 저장되도록합니다.

2

컴파일러에 따라 다르지만 필자가 살펴본 모든 함수는 호출 가능한 함수를 만듭니다 대체 된 템플릿 매개 변수를 사용하여 각 변수에 대한 코드를 생성합니다. A (매우) 간단한 예로서

:

인라인 Max<int>Max<float>로 호출하지
template <typename T> T Max(T a, T b) 
{ 
    return a > b ? a : b; 
} 

는, 컴파일러가 생성 (그들은 다른 문제를 방지하기 위해, 그러나 특별한 방법으로 장식되어 있습니다) :

int Max(int a, int b) 
{ 
    return a > b ? a : b; 
} 

float Max(float a, float b) 
{ 
    return a > b ? a : b; 
} 

이 다음 참조 다음 개체의 시작 부분에 붙어하고, 다음 같은

2

(MSVC에서) 너무 일부 인라인 수행됩니다 그것은 의존한다. 가장 많이 사용되는 구현 중 일부는 인스턴스 화를 트리거하는 각 객체 파일 에 인스턴스화 코드의 사본을 생성하고 으로 링커를 계산하여 하나를 제외하고 모두 제거합니다. 다른 컴파일러는 구체화가 저장되는 저장소의 일종을 사용합니다. 인스턴스가 이미있는 경우 컴파일러에서 을 다시 생성해야합니다. 이 솔루션은 훨씬 빠르며 디스크를 첫 번째 솔루션보다 적게 사용하지만 이 더 어렵습니다. (컴파일러는 새로운 인스턴스 을 생성 할 수있다뿐만 아니라 하나가 존재하지 않는,하지만 인스턴스가 의존 할 파일이 변경된 경우합니다.)

0

템플릿은 정말 아주 아주 고급 매크로 (#DEFINE는)

매개 변수가 전달 된 값으로 컴파일 타임에 교체된다. 정말 좋은 컨셉과 또한 아주 잘 구현.

+0

매크로는 템포와 템플릿으로 섞여서는 안되며 이미 개념을 혼동해야합니다. 매크로는 첫 번째 변환 단계에서 오른쪽으로 확장됩니다. 즉, C++ 파서로 전달되는 토큰을 생성 할 수 있습니다. 이것은 템플릿으로는 불가능합니다. –

0

템플릿은 완전한 언어입니다. 그들은 튜링 완료이지만, "프로그램"은 컴파일 타임에 실행됩니다. 이들은 컴파일 타임에 객체 유형을 대체하고 컴파일 타임에 클래스, 함수 등을 어셈블하는 코드 팩토리입니다.따라서 C++과 호환되는 대규모 사전 처리 언어로 타입 안전하다고 생각할 수 있습니다. 실행 결과는 순수한 C++ 코드로서 다른 모든 작업을 수행 할 때와 마찬가지로 컴파일러에서 처리 할 수 ​​있습니다.

컴파일러는 일반적으로 인라인을 무시합니다. 프로그래머가 가장 적합한시기와 조립을하지 않은 사람을 실제로 알 수 있습니다.