Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在模板函数中包含不变假设_C++_Templates_Optimization_Metaprogramming_Numerical Methods - Fatal编程技术网

C++ 在模板函数中包含不变假设

C++ 在模板函数中包含不变假设,c++,templates,optimization,metaprogramming,numerical-methods,C++,Templates,Optimization,Metaprogramming,Numerical Methods,考虑一个典型的有限差分应用: //假设T_大小>2 无效过程(双*T0、双*T、常量int和T大小、布尔周期){ 对于(int i=0;i0)和+=(T0[i-1]-基); 如果(i

考虑一个典型的有限差分应用:

//假设T_大小>2
无效过程(双*T0、双*T、常量int和T大小、布尔周期){
对于(int i=0;i0)和+=(T0[i-1]-基);
如果(i<0)和+=(T0[i+1]-基);
如果(周期性){
如果(i==0)和+=(T0[T_size-1]-基);
如果(i==T_size-1)和+=(T0[0]-基);
}否则{
如果(i==1 | | i==T_size-1)和+=0.5*(T0[i-1]-基);
如果(i==0 | | i==T_size-2)和+=0.5*(T0[i+1]-基);
}
T[i]=T0[i]+sum*0.08;//其中0.08是某个幻数
}
}
周期性检查是循环不变的,但由于只有在运行时才知道,因此每次都会产生条件检查成本。我可以创建一个专门的函数,它假设一个实例,但是维护共同的基础将是繁琐的,特别是在三维问题的情况下,它将增长到8个函数(周期:没有,X,Y,Z,XY,XZ,YZ,XYZ)来考虑所有的组合。 可以通过元编程解决这个问题吗


p/S:分支预测器能否相应地对此进行优化?

模板可能具有非类型参数:

模板
无效过程(双*T0、双*T、常数int和T大小)

当然,这意味着在call site上编写类似的内容需要花费一定的成本:

bool periodicFunction = {whatever};
if (periodicFunction)
    process_T<true>(...);
else
    process_T<false>(...);
bool periodicFunction={whatever};
if(周期函数)
过程(…);
其他的
过程(…);
是的,你可以

enum Periodicity
{
    PERIODICITY_NONE,
    PERIODICITY_X,
    PERIODICITY_Y
    // etc
};
然后

template <Periodicity P>
void process_T(double* T0, double* T, const int& T_size)
{
    if (P == PERIODICITY_NONE) // ... do something
    if (P == PERIODICITY_X) // ... do something else

    // Common code
}
模板
无效过程(双*T0、双*T、常数int和T大小)
{
如果(P==周期性_无)/…做某事
如果(P==周期性X)/…做其他事情
//通用代码
}

任何适当的优化编译器都能够在编译时执行检查,并消除任何死掉的代码(g++似乎在
-O0
时也会这样做)。

这难道不意味着我还需要维护两个专门的函数吗?或者编译器会在函数实例化时优化不相关的情况吗?任何相当复杂的编译器都会优化这些情况。至少MSVS2013确实完全消除了
if(periodic&&
if(!periodic)
分支中的代码。你的答案很神奇!当我在2d有限差分代码上进行测试时,对于更长的迭代,模板化代码比依赖参数的代码要快得多(尽管出于某种原因,
周期性的
错误的情况下没有加快速度)。但是我希望有一种方法来处理呼叫站点的丑陋。有没有办法对其进行元编程?只有丑陋的。看看这些问题:如果你想完全确定正在进行的优化,你可以移动对一个函子“编写代码”并使用专门化来选择正确的代码段。当然,但是您依赖于内嵌函子的
操作符()
…很容易检查它是否正在发生,尽管我猜是这样。另外,它更容易键入!:-)相关问题: