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

标签 c++ templates optimization metaprogramming numerical-methods

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

// 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 的检查是循环不变的,但由于仅在运行时已知,因此每次都会产生条件检查成本。我可以创建一个专门的函数来假设其中一种情况,但是维护公共(public)基础会很麻烦,特别是在三维问题会增长到 8 个函数(周期性:无,x,y,z, xy, xz, yz, xyz) 来考虑所有组合。

是否可以通过元编程来解决这个问题?

P/S:分支预测器可以相应地优化它吗?

最佳答案

模板可以有非类型参数:

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>(...);

关于c++ - 在模板函数中包含不变假设,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19653105/

相关文章:

c - 我怎样才能最小化这个程序的代码大小?

c++ - Boost Karma - 非消耗谓词

c++ - 无法从 void 函数中显示到 UI - QT

c++ - 如何使用 Variadic 模板来展平类型树?

html - 无法从 html/template Golang 访问数据

php - 使用 PHP 函数别名是否性能不佳/不好的做法?

c++ - 将文本读入字符串与直接用文本初始化字符串

c++ - 良好做法 : To Modify Only Function Parameters?

c++ - 使用 'class' 或 'typename' 作为模板参数?

python - Hotshot 错误地报告了简单的 Python 代码运行时间异常长