2017-12-18 16 views
0

템플릿 코드의 코드 크기에 대해 궁금합니다. 내가 두 벡터의 인스턴스가있는 경우, 코드C++ 템플릿 - 코드 사용량, 바이너리 크기

template<typename T> 
class vector 
{ 
public: 

vector(size_t size) : 
{ 
    array = NEW T[size]; 
} 


uint32_t push_back(T value) 
{ 
... adding value to array and possible array realloction.. 
} 

private: 
T * array; 
} 

다음 사항을 고려하십시오

vector<float> v1; 
vector<int> v2; 

이 두 push_back 구현

push_back(float) 
push_back(int) 

또는 하나 또는 뭔가 다른 이진 컴파일됩니다 ?

floatint에 대해 분리 된 클래스 대신 템플릿을 사용하여 코드 크기를 다시 조정할 수 있습니까?

+7

최적화를 사용하여 컴파일하고 맵 파일을 생성하십시오. 다른 컴파일러/링커는 일을 다르게 할 것입니다. –

+0

컴파일러, 시스템, 최적화 수준 및 달주기에 따라 달라집니다. – user1810087

+0

따라서 일반적인 규칙은 무엇입니까? GCC는 어떻습니까? –

답변

0

템플릿에서 인스턴스화 된 클래스와 함수는 런타임시 템플릿간에 인스턴스화되지 않으므로 함수가 복제됩니다.

일부 컴파일러는 공유/중복 코드를 최적화하지만이 최적화의 범위는 템플릿 인스턴스보다 넓습니다.

코드가 같아도 특정 연산자가 사용될 때 다른 함수 호출을 트리거 할 수 있습니다.

이것은 특히 std::vector<int*>std::vector<char*>과 같은 포인터 컨테이너에 대해 볼 수 있으며, 동작이 실질적으로 동일하지만 서로 다른 기능을 제공합니다.

요약하면 템플릿은 코드 크기를 줄이는 데 우수하지만 많은 인스턴스를 생성하면 바이너리가 부 풀릴 것입니다.

+3

음, msvc에서 접히는 comdat은 동일한 어셈블리가있는 함수를 제거하므로 일반적으로 클레임이 틀립니다. – Yakk

+0

@ tobi303 - 고정. – egur

+0

@ Yakk - 두 번째 단락에서 컴파일러 최적화를 언급했습니다. 사실, 많은 템플릿 생성 코드는 다른 어셈블리를 생성 할 것이고, 나는 3 장에서 그것을 썼다. – egur