2015년 9월 9일 수요일

[C++11] Lazy instantiation

Lazy instantiation
: 정의한 template 코드를 실제로 사용하지 않으면 컴파일러가 type에 맞는 변형된 code 를 생성하지 않는다.



AAA aaa; 컴파일 하면 왜 에러가 나는 것일까?
AAA class 의 void foo(int a); 함수에서 int a 를 *a 로 역참조하기 때문이다.

하지만 BBB bbb; 는 컴파일 하면 에러가 발생하지 않는다.
왜 일까?
template 은 정확히 class 가 아니라 틀(template)이기 때문에
실제 template 내의 코드(함수)를 사용하지 않으면 컴파일러가 변형된 code를 생성하지 않는다.
이것 이 "Lazy instantiation" 개념이다.
만약 main() 함수에서 아래와 같이 호출하는 code가 있었다면,
bbb.foo(0); //error. 실제 function 을 호출하기 때문에 error 발생
그 때는 class BBB 의 void foo(int a); code 가 생성되므로
역참조에 대한 컴파일 에러를 발생시키게 된다.






댓글 없음:

댓글 쓰기

[C++] meta programing

재귀 호출에 관해 template meta programming 을 적용한 예제를 살펴보자. #include using namespace std; int fact(int n){ if(n factorial 연산을 하는 일반적인 재귀 호출 함...