c++のテンプレートクラスは重い?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
discomania
記事: 2
登録日時: 12年前

c++のテンプレートクラスは重い?

#1

投稿記事 by discomania » 12年前

ipadにて、c, c++, objective-cの混在したソースでゲームを作成しています。

ゲーム内に表示するオブジェクトについて、最近までコンストラクタにオブジェクトIDを渡す方式でインスタンス化していました。

例:

コード:

 Monster* monster = new Monster( enum_monster_slime );
 Monster* monster2 = new Monster( enum_monster_skeleton );
これをテンプレートクラス化し、

コード:

 Monster* monster = MonsterFactory::createMonster( enum_monster_slime );
のような形で呼び出すようにしたところ、ゲームが異様に重くなり、ほとんどプレイ不可能なほどになりました。

テンプレートクラスとファクトリークラスは

コード:

template<int monsterType>
class MonsterSubClass: public Monster {
      MonsterSubClass(): Monster( monsterType ) { }
}

class MonsterFactory {
public:
 static Monster* createMonster ( int monsterType ) {
      Monster* monster = NULL;
  switch( monsterType ) {
           case enum_monster_slime:
               monster = new MonsterSubClass<enum_monster_slime>();
     ......
      }
      return monster;
   }
}
といった感じです。
テンプレートによって数多くのクラス定義が生まれるのがいけないのでしょうか?
それとも、テンプレート化されたクラスは実行時に負担が大きいものなのでしょうか?

googleで調べてみても特にそう言った情報は見当たらず、困惑しています。
詳しい方いらっしゃいましたら、ご教授お願いします。
最後に編集したユーザー discomania on 2014年1月02日(木) 21:53 [ 編集 2 回目 ]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: c++のテンプレートクラスは重い?

#2

投稿記事 by softya(ソフト屋) » 12年前

テンプレートはコンパイル時にクラスのバリーエーションが生成されるので、実行速度には影響しないはずです。
もし影響するとしたら、沢山のクラスのメモリ消費ぐらいでしょうか。あとnewとdeleteの繰り返しが重いとか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: c++のテンプレートクラスは重い?

#3

投稿記事 by h2so5 » 12年前

テンプレートを利用しても実行速度は低下しません。
別のところに原因があると思います。

あと、コンパイルできる正確なコードを貼ってください。
テンプレート引数なしのMonsterSubClassのポインタは宣言できないはずです。

discomania
記事: 2
登録日時: 12年前

Re: c++のテンプレートクラスは重い?

#4

投稿記事 by discomania » 12年前

失礼しました。
MonsterFactoryクラスのcretateMonseterメソッドの戻り値はMonster*でした。
newは起動時に一括して行っているので、newとdeleteの繰り返しということはありません。

factoryクラスを介さずに直接cretateすると元の速度に戻るのですが、実行時の負担がかからないはずとなると、
どこかにメモリ異常などのバグがあって、たまたまfactoryクラスを介した時だけその問題が現れている、ということでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: c++のテンプレートクラスは重い?

#5

投稿記事 by softya(ソフト屋) » 12年前

> newは起動時に一括して行っているので、newとdeleteの繰り返しということはありません。
Monster* monster = MonsterFactory::createMonster( enum_monster_slime );
を最初に行っていると言うことでしょうか。これと言って遅くなる理由は無い気がします。
何らかのバグの表面化の気がしますね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る