0
以下模板转乘FUNC <7>(42)和FUNC(42,7)模板参数语法
template<typename Data, typename Number>
int compute(Data d, Number n) {
if(n > 10) SLOW(d)
if(n < 30) EXPENSIVE(d)
if(n < -10) .. if(..) // etc.
return d.abc();
}
有时也被称为具有动态计算Number n
:compute(data, runtime_number)
, 和有时与编译时已知参数: compute(data, 3)
。
如果我不相信编译器优化后一种情况(有或没有内联),但相信它足以使if(false)
块消失,我将不得不复制大量代码并编写compute<12>(data)
模板。除了代码重复之外,compute(data, number)
只是更好,更直观。
有没有办法统一这两个?
编辑:这更多的是模板,或模板滥用,如果你会,比对优化编译器可以适用于这种情况。
我看到它的方式,在这里没有太多的优化。在最糟糕的情况下,你会得到一些额外的常量比较(每个循环1次),也可能是一个或两个分支。由于您提到函数“SLOW”和“EXPENSIVE”被调用取决于结果,这些优化根本没有任何区别。 – us2012
对,这些功能较少,更多关于从代码中移除if()...块。除了轻量级比较函数外,还有分支预测失误的代价:有很多'if'子句(没有'else'!),并且这个函数经常被调用。 – toting
如果SLOW和EXPENSIVE是纯函数,也许可以缓存结果。 – jcarpenter2