我有一个代码如下:
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)
我的想法是,根据参数,我想将一些数学表达式应用于a和b.这个函数执行很多次并且必须很快,我想知道每次迭代的那些条件分支是否会引入我可以节省的开销.
现在,我写了这样的代码:
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_X来function(我会改变函数调用的条件句)?
如果我将整个函数编码为宏(uf)并将数学表达式设置为参数怎么办?
如果我使用模板并将数学表达式作为指向内联函数的指针传递(这是否可能)怎么办?
编辑:谢谢你的回答.我知道我可以使用你提出的方法(指向/数组函数,或依赖于分支预测器).但是,您是否对避免开销更好的方面有所了解?数学表达式非常简单(类似a*b),除了很长的循环外,function还会多次调用(分支预测在调用之间"存活"吗?).
您可以将函数转换为模板:
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)