템플릿으로 인한 용량 폭발을 막기 위한 방법?
템플릿의 인스턴스화된 코드가 각각의 오브젝트 코드마다 하나씩 생기는 것을 막기 위해 -fno-implicit-templates 옵션을 썼는데,
에러가 뜹니다.
==== main.cpp
#include <vector>
using namespace std;
void processVec(vector<int>& vec);
int main(int argc, char** argv)
{
vector<int> intVec;
processVec(intVec);
return 0;
}
==== process.cpp
#include <vector>
using namespace std;
void processVec(vector<int>& vec)
{
for (int i = 0; i < 100; ++i)
vec.push_back(i);
}
template class vector<int>;
====
$ g++ -fno-implicit-templates main.cpp process.cpp
... undefined reference 에러들...
아시겠지만, -fno-implicit-templates 옵션을 주지 않고 컴파일 하면,
main.o 와 process.o 각각에 vector<int> 의 인스턴스 코드가 들어가서
최종 결과물에 중복되는 코드가 생기게 됩니다.
(모듈화를 많이 해서 여러개의 오브젝트로 나눌수록, 최종 결과물은 눈덩이처럼 불어나겠지요)
그것을 막기 위해, 명시적으로 인스턴스화를 하지 않는한
오브젝트 코드에 인스턴스화된 템플릿 코드를 생성하지 않도록 하는 옵션이 바로,
-fno-implicit-templates 옵션인데요.
위 코드를 보시면, main.cpp 에서는 명시적 인스턴스화를 하지 않았고,
process.cpp 에서만 명시적으로 인스턴스화를 해 주었습니다.
(process.cpp 코드 중에 초록색 부분요)
그런데, 막상 컴파일 해보면, 명시적으로 인스턴스화 하는 것이 제대로 되지 않았는지,
템플릿 코드와 관련한 Undefined reference 에러가 뜨더군요.
명시적 인스턴스화 하는 문법을 제가 잘못 알고 있는 것인지...
(그렇다면 컴파일 에러가 나야할텐데, 에러는 링크 단계에서 납니다.)
템플릿으로 인한 코드 부풀림 때문에,
저처럼 해 보신 분이 많을 것으로 아는데요,
이런 에러 보신 분 안 계시나요?
(cygwin + gcc 3.3.3 입니다.)
정말 눈덩이처럼 커지던가요main.cpp add.cpp, sub.cp
정말 눈덩이처럼 커지던가요
main.cpp add.cpp, sub.cpp, mul.cpp를 각각 구현하고(각각에 vector<int>를 추가했습니다.) 하나씩 추가하면서 컴파일 해보니 거의 사이즈 변화가 없습니다..
그리고 -fno-implicit-templates의 유무도 실행화일의 사해봤습니다.)이즈와 상관이 없군요.. (리눅스:3.4.0, osx panther:3.3 20030304에서 해봤습니다.)
그리고 explicit(manual) instantiation은 project의 규모가 커진다면 코드가 방대해진다면 별 장점이 없어보입니다. vector도 각각의 데이타타입에 대해서 인스턴스가 만들어질 가능성이 많고, 사용자가 일일이 instantiation시점을 결정하는게 큰 부담이 될거 같습니다.
Life rushes on, we are distracted
댓글 달기