C++のtemplate使用と実行ファイルサイズの関係について


hole  2005-09-03 01:59:26  No: 58834

少し気になっている事がありますので教えてください。

C++のtemplateを使用したソースをビルド(VC6.0)すると、使用しない場合に比べて
作成される実行ファイルサイズが増しているように感じます。
またtemplateを使用したソースは、少しコードを加えただけで結構簡単に実行ファイル
サイズが増大していくように感じています。

上記の事は事実(templateを使用するとファイルサイズ増になり易い)でしょうか。
それとも私の思い違いでしょうか?
事実の場合、ファイルサイズ増大を抑える対策、テクニック等はありますでしょうか?

よろしくお願いします。

環境:WindowsXP+sp2, VC++6.0+sp6, SDK


とおりすがり  2005-09-03 23:40:20  No: 58835

templateというものが、どういうものか理解していれば、理論的には自明な話なんですが…
まずは、

>C++のtemplateを使用したソースをビルド(VC6.0)すると、使用しない場合に比べて
>作成される実行ファイルサイズが増しているように感じます。

どういうコードを比較したのですか?
template使用コードと"同等の"、使用しないコードで比較しましたか?
例えば、

/*
struct A {
  int data_;
  A(int data) : data_(data) {}
  ~A() {}
  int data() const { return data_; }
};
/*/
template <typename T>
struct B {
  T data_;
  B(T data) : data_(data) {}
  ~B() {}
  T data() const { return data_; }
};
//*/

int main() {
/*
  A obj(100);
/*/
  B<int> obj(100);
//*/
  return obj.data();
}

というコードをAとBで切り替えて、ビルドしても生成された実行モジュールサイズは同じでした。
まあ、実際にはtemplateありなしで、いろいろ違いが出てしまうことは避けられないことが
多いので、違いが出てくるのでしょう。


DD.  2005-09-04 02:17:10  No: 58836

知っていたならばごめんなさい。

template や STL を扱う上での欠点の1つに
乱用時のコードの膨張があります。

template < typename T >
class base { ... };

コード内では template を扱うbaseクラスが1つしか記述されていなくても

base< int  > xxx;
base< long > xxx;
base< char > xxx;

それを乱用することにより、型違いの base クラスが結局3つできることになります。
そうすると当然コードサイズは膨らんでいきます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加