인프런 커뮤니티 질문&답변

김기환님의 프로필 이미지
김기환

작성한 질문수

홍정모의 따라하며 배우는 C++

13.2 클래스 템플릿

explicit instantiation 을 하게되면 메모리적으로 어떻게 되나요?

작성

·

212

3

explicit instantiation 을 하게되면 단순하게 컴파일러에게 어떤 타입을 사용할지만 알리는 역할을 하게되나요?

따로 메모리가 생성된다던지 그런일이 발생하는지 궁금해요

답변 2

7

안녕하세요.

메모리가 할당됩니다! 컴파일은 문법 체크와 더불어 배열같이  static한 영역들을 메모리에 할당하는 일을 합니다. 클래스의 멤버 함수 정의도 컴파일타임에 메모리가 할당이 됩니다. (각각의 객체들마다 따로 메모리를 가지는멤버 변수들과는 다르게 멤버 함수는 객체마다 따로 함수 메모리를 가지는 방식이 아닙니다. 멤버 함수는 어딘가 한군데에 저장이 되고 각 객체마다 이 함수가 정의된 메모리를 공유하여 사용하는 방식입니다. 따라서 멤버함수 메모리 정의는 static한 부분이기 때문에 컴파일타임에 이루어집니다.)

애초에 링킹에러가 발생했던 이유가 어떤 타입으로 구체화될지를 알아야 할당할 메모리의 크기를 알 수 있는데 다른 cpp파일에다가 멤버 함수 템플릿을 따로 빼는 바람에 그 cpp파일을 컴파일 할 때 메모리 할당이 이루어지지 못했기 때문이었습니다. 그 상태에서 main.cpp 에서 print()을 사용하려고 했기 때문에 링킹 에러가 발생했던 것입니다. 

따라서 이와 같이 explicit instantiation 을 해주면 미리 char 로 구체화 될 떄의 print(), double로 구체화될 때의 print() 함수 바디가 각각 컴파일 타임에 메모리가 잡혀지기 때문에 문제 없게 됩니다.

1

김기환님의 프로필 이미지
김기환
질문자

아 char 데이터 타입인 print 함수를 만들어 공유하는 형식이군요...

감사합니다.

김기환님의 프로필 이미지
김기환

작성한 질문수

질문하기