ページ 11

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

Posted: 2014年1月02日(木) 19:23
by discomania
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で調べてみても特にそう言った情報は見当たらず、困惑しています。
詳しい方いらっしゃいましたら、ご教授お願いします。

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

Posted: 2014年1月02日(木) 19:36
by softya(ソフト屋)
テンプレートはコンパイル時にクラスのバリーエーションが生成されるので、実行速度には影響しないはずです。
もし影響するとしたら、沢山のクラスのメモリ消費ぐらいでしょうか。あとnewとdeleteの繰り返しが重いとか。

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

Posted: 2014年1月02日(木) 19:43
by h2so5
テンプレートを利用しても実行速度は低下しません。
別のところに原因があると思います。

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

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

Posted: 2014年1月02日(木) 21:56
by discomania
失礼しました。
MonsterFactoryクラスのcretateMonseterメソッドの戻り値はMonster*でした。
newは起動時に一括して行っているので、newとdeleteの繰り返しということはありません。

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

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

Posted: 2014年1月02日(木) 23:03
by softya(ソフト屋)
> newは起動時に一括して行っているので、newとdeleteの繰り返しということはありません。
Monster* monster = MonsterFactory::createMonster( enum_monster_slime );
を最初に行っていると言うことでしょうか。これと言って遅くなる理由は無い気がします。
何らかのバグの表面化の気がしますね。