본문 바로가기
Language/C++

템플릿 함수 사용시 유의사항

by W00gie 2021. 3. 2.

함수 템플릿은 다양한 타입에 대해 대응할 수 있게 해준다.

매크로를 이용한 방법도 있지만 매크로 함수는 아주 간단한 동작에만 쓸 수 있어 활용에 한계가 있다.

 

템플릿의 선언은 다음과 같은 형식이다.

template <typename T>
T function(T a,T b)

{

 ...

}

 

템플릿을 사용시 주의할 점은 함수 템플릿은 함수의 형식을 기억하는 틀일 뿐 그 자체로 작동하는 함수가 아니라는 점이다. 함수가 호출 되는 시점에 컴파일러로부터 호출 인수의 타입에 맞는 함수가 만들어진다. 이러한 과정을 인스턴스화라고 한다.

 

호출 되기전까지 템플릿 자체는 메모리를 소모하지 않는다. 다만 호출되는 함수가 많아질수록 다양한 버전의 함수가 생성된다는 점에 유의해야한다.  호출된 타입에 대해 인스턴스화 시키거나 함수를 삭제하는 것은 전적으로 컴파일러가 담당하기는 하지만, 매 타입마다 함수가 새로 생성되므로 소스는 짧아지고, 유지보수가 편해지지만 인수의 타입이 다양할 수록 메모리를 차지하므로 실행 파일의 크기는 오히려 커진다는 점에 유의해야한다.

 

메모리를 절약하려면 템플릿보다 Void *를 사용하여 임의의 데이터를 처리하는 방식을 사용해야할 것이다.

Void *는 임의 타입의 어드레스를 받아 메모리끼리 복사하는 것이다.

 

#include <stdio.h>
#include <malloc.h>
#include <memory.h>

void swap(void *a, void* b, size_t len)
{
	void *t;
    t = malloc (len);
    memcpy(t, a, len);
    memcpy(a, b, len);
    memcpy(b, t, len);
    free(t);
}

int main()
{
	int a= 3, b=4;
	double c= 1.2, d=3.4;
	swap(&a, &b, sizeof(int));
    swap(&c, &d, sizeof(double));
    printf("a=%d,b =%d\n",a,b);
    printf("c=%d,d =%d\n",c,d);  
 }

 

Void *는 어떤 타입이 전달될지 알 수 없으므로 변수의 길이를 인수로 전달받아야 하고, 함수 내 지역 변수도 동적할당해야 하는 어려움이 있지만, 메모리 효율과 소스길이 두 가지 측면에서 이득을 볼 수 있다.