私のアプリケーションでは、構造体に特殊なケースを導入することで、約 2 倍のスピードアップを達成しました。
単純化すると、私のコードは次のようになります。
class SpecialCase
{
private:
size_t values[10];
public:
void foo();
};
class GenericCase
{
private:
std::vector<size_t> values;
public:
void foo();
};
template <class Case> void bar()
{
Case case;
case.foo();
}
void somewhereElse()
{
if ( boring_runtime_condition )
{
bar<SpecialCase>();
}
else
{
bar<GenericCase>();
}
}
このコードには問題はありませんが、別のクラスでアプリケーションを拡張する必要があります。
class Problem
{
private:
std::vector<Case> cases;
public:
Case doSomething();
};
SpecialCase と GenericCase の両方を使用するには、クラス全体をテンプレートにする必要があります。いくつかの特殊なケースがあるため、これによりコンパイルが大幅に遅くなります。私はそれがまったく好きではありません。
アプリケーションの実行中に SpecialCase と GenericCase を混在させることはありません。コードが肥大化し、他の開発者がそれを忘れる可能性があるため、すべてのメソッドでCase を特定の型にキャストする必要はありません。
このテンプレートの狂気を回避する良い方法はありますか? (C++11 ソリューションも大歓迎です)
免責事項: がどれだけ優れているかstd::vector
、特別なケースを使用すべきではないなどとは言わないでください。パフォーマンスを測定したので、2 倍のスピードアップを信じないというコメントを残さないでください。それは事実であり、この質問はそれについてではありません。