避免循环内的条件和函数调用

Chr*_*ger 5 c++

我有一个代码如下:

void function(int parameter)
{
  for( ... ) // a big loop
  {
    double a = ...;
    for( ... ) // a big loop
    {
      double b = ...;

      double value;
      if(parameter == 1)
        value = some_math_expression_1(a, b);
      else if(parameter == 2)
        value = some_math_expression_2(a, b);
      ...
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我的想法是,根据参数,我想将一些数学表达式应用于ab.这个函数执行很多次并且必须很快,我想知道每次迭代的那些条件分支是否会引入我可以节省的开销.

现在,我写了这样的代码:

void function(int parameter)
{
  if(parameter == 1)
    function1();
  else if(parameter == 2)
    function2();
  else
    ...
}
Run Code Online (Sandbox Code Playgroud)

因此,如果我在每个代码中重复代码,我可以直接应用数学表达式functionX().显而易见的问题是,当我想要更改某些代码时,我必须多次执行此操作(现在我有大约10个数学表达式).

我可以使用什么方法来避免任何开销function

如果我一个指针传递给函数some_math_expression_Xfunction(我会改变函数调用的条件句)?

如果我将整个函数编码为宏(uf)并将数学表达式设置为参数怎么办?

如果我使用模板并将数学表达式作为指向内联函数的指针传递(这是否可能)怎么办?

编辑:谢谢你的回答.我知道我可以使用你提出的方法(指向/数组函数,或依赖于分支预测器).但是,您是否对避免开销更好的方面有所了解?数学表达式非常简单(类似a*b),除了很长的循环外,function还会多次调用(分支预测在调用之间"存活"吗?).

rod*_*igo 5

您可以将函数转换为模板:

void functionT<int PARAMETER>()
{
  for( ... ) // a big loop
  {
    double a = ...;
    for( ... ) // a big loop
    {
      double b = ...;

      double value;
      if(PARAMETER == 1) //Constant condition!!!
        value = some_math_expression_1(a, b);
      else if(PARAMETER == 2)  //Constant condition!!!
        value = some_math_expression_2(a, b);
      ...
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

由于条件总是为真或总是为假,编译器将优化条件树并只留下真正的数学表达式。没有分支,也没有函数调用!

现在,您只能将其与常量参数一起使用:

functionT<1>();
Run Code Online (Sandbox Code Playgroud)

但不适用于变量:

int x = 1;
functionT<x>(); //Error
Run Code Online (Sandbox Code Playgroud)

如果你需要的话,你可以制作一个包装器:

void function(int parameter)
{
    switch (parameter)
    {
        case 1: functionT<1>(); break;
        case 2: functionT<2>(); break;
    }
}
Run Code Online (Sandbox Code Playgroud)