c ++中许多模板的替代品

时间:2018-03-09 12:27:06

标签: c++ templates polymorphism

我正在使用gcc 5.4.0开发一个c ++ 11应用程序2.在这个应用程序中,我有以下模板:

template <class T1, class T2, class T3>
class Operator
{
    T3* op1(T1* operand1, T2* operand2);
    T3* op2(T1* operand1, T2* operand2);
    T3* op3(T1* operand1, T2* operand2);
    T3* op4(T1* operand1, T2* operand2);
    //...
   T3* opn(T1* operand1, T2* operand2);
};

在op1,op2,... opn中,我需要对数组做一堆事情(预计会有数亿个元素)。像算术,比较,副本等。我选择使用模板,因为我希望有类似的结构:

#pragram omp parallel for
for(int64_t i = 0; i < length; i++)
{
    r[i] = operand1[i] /*operations here*/ operand2[i]
}

出于性能原因,使用嵌套ifs检查for循环中的类型是没有意义的。因为我想支持很多类型,比如(int8_t,int16_t,int32_t,int64_t,float和double,也可能是unsigned),如果每次操作我为每个组合创建了一堆for循环,我的代码就会过于膨胀类型。

问题是,如果我想支持大约6到10种类型的东西,编译器需要生成10 ^ 3版本的代码。因为它足以满足T1,T2和T3类型的所有可能组合。

生成并编译所有这些需要很长时间。所以,我正在寻找一种替代方案,它不需要花费太多时间来编译,也不会增加太多的开销。我在考虑使用多态,但我不知道如何得到类似的结果,主要是因为类型超载,我需要运算符:=,+, - ,*,/,&gt; ,&lt;等等,以某种方式工作所有这些类型,我得到&#34;免费&#34;用模板。

非常感谢任何指针。

编辑:我的应用程序将处理用户的数组,它将保持用户的数据(类型和布局)。这些阵列可以是任何类型。所以我可能需要添加int64_t和double,或者不同类型的任意组合。为了灵活性,我在我的应用程序中有一个代码路径,它实例化所有可能的1000种组合(我通过使用递归宏来实现)。所以我真的在寻找一种方法,即使对于这么多模板也要减少编译时间,或者将它改成多态结构。

EDIT2:经过一些调整(我的生成宏的改进很少),我能够在大约30分钟内使用O3进行编译。这对于部署和分发是可以的,但对于开发来说非常糟糕。因此,我将设置一个调试标志,并使用简化类型支持(仅4或6)进行编译,这将大大减少编译时间。感谢您的所有投入。

1 个答案:

答案 0 :(得分:2)

如果要实例化所有这些函数,避免代码膨胀的唯一解决方案是,如果可能,找到公共类型来对公共类型执行操作然后转换回到具体类型:

common_type operator +(common_type,common_type);

template<class T1,class T2,class T3>
inline T1 operator +(T2 a, T3 b){
  return T1{common_type{a}+common_type{b}};
  }

使用类别理论术语,您需要找到morphism来自您定义的每个类(考虑它们是类别表示)到common_type类的{{3}}。这不是一件容易的事,也可能是不可能的。

也许中间人可能是T1 operator+(common_type,common_type); ...