考虑典型的有限差分应用:
// assuming T_size > 2
void process_T(double *T0, double *T, const int &T_size, bool periodic) {
for (int i = 0; i < T_size; ++i) {
double sum = 0;
double base = T0[i];
if (i > 0) sum += (T0[i-1]-base);
if (i < 0) sum += (T0[i+1]-base);
if (periodic) {
if (i == 0) sum += (T0[T_size-1]-base);
if (i == T_size-1) sum += (T0[0]-base);
} else {
if (i == 1 || i == T_size-1) sum += 0.5*(T0[i-1]-base);
if (i == 0 || i == T_size-2) sum += 0.5*(T0[i+1]-base);
}
T[i] = T0[i] + sum * 0.08; // where 0.08 is some magic number
}
}
对periodic
的检查是循环不变的,但由于仅在运行时已知,因此每次都会产生条件检查成本。我可以创建一个专门的函数来假设其中一个案例,但维护公共基础会很麻烦,特别是在三维问题的情况下,它将增长到8个函数(周期性:无,x,y,z, xy,xz,yz,xyz)考虑所有组合。
是否可以通过元编程来解决这个问题?
P / S:分支预测器可以相应地优化它吗?
答案 0 :(得分:2)
模板可能包含非类型参数:
template <bool periodic>
void process_T(double *T0, double *T, const int &T_size)
当然,这意味着在通话网站上编写类似这样的内容的费用:
bool periodicFunction = {whatever};
if (periodicFunction)
process_T<true>(...);
else
process_T<false>(...);
答案 1 :(得分:2)
是的,你可以
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
}
任何体面的优化编译器都能够在编译时执行检查,并且可以消除任何死代码(即使在-O0
,g ++也会出现这种情况)。