有一个轻量级的类在代码中扮演核心角色。实际上,有两种变体(例如V0
和V1
);两者都有方法do_it()
。此方法在V0
中占用大约10个浮点运算(FPO),在V1
中大约需要20个FPO。这是一个很小的数字,但do_it()
一直被调用,总体来说这些调用需要30% - 70%的执行时间。
在我当前的实现中,V0
和V1
是依赖于它们的所有其他类的模板参数,因此在编译时会确定do_it()
的正确变体。
问题基本上是代码中的任何类使用V
或使用使用V
的类,因此实际上所有类都是模板。随着时间的推移,它变得有点烦人,难以维护。
我可以使用哪种其他C ++机制代替模板?任何人都可以估计这种情况的开销吗?当然,当我重写代码时,我将学习实际的数字,但这是一项非常重要的投资
修改 我还提供一个(非常简化的)例子:
我们说V0
和V1
是2D空间中的点。 V0
位于一个平面上,V1
位于一个球体上。
do_it()
是计算点之间距离的方法,在V0
的情况下,V1
比Points<V>
然后我有课程,例如std::vector<V>
继承自RandomWalk<V>
,Points<V>
,其中包含对plot_distribution<V>(Points<V>)
的引用,许多分析代码,如Shared Numbervar array intarr;
intarr:=intarr+Databasefield;
databasefield
等。
也许在未来的某个时刻,用户将被允许提供他们自己的几何,例如一个圆环。但是现在只允许两种几何形状,它们不会同时出现在程序中。
答案 0 :(得分:3)
好的旧宏仍然可以完全使用。
#define NS NS_ ## VARIANT;
namespace NS
{
using Variant = VARIANT;
class Foo
{
Variant* v;
// etc
};
// everything goes here
}
现在编译整个项目两次,一次使用-DVARIANT = V0,一次使用-DVARIANT = V1。没有开销!
答案 1 :(得分:0)
如果您知道模板参数仅限于某些类(例如V0
和V1
),那么您可以将所有模板代码移至 .cpp 文件中正常,并将其链接如下...
标题(.h)
template<class T>
class Foo
{
public:
void Do();
};
实施(.cpp)
template<class T>
void Foo::Do()
{
///do stuff...
}
//this creates two entries in the object code for link time resolution of Foo<V0> and Foo<V1> but Foo<anything else> will fail to link
template class Foo<V0>;
template class Foo<V1>;