템플릿으로 인한 용량 폭발을 막기 위한 방법?

freezm7의 이미지

템플릿의 인스턴스화된 코드가 각각의 오브젝트 코드마다 하나씩 생기는 것을 막기 위해 -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 입니다.)

yielding의 이미지

정말 눈덩이처럼 커지던가요
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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.