C++ 交换功能<;7>;(42)和func(42,7)模板参数语法

C++ 交换功能<;7>;(42)和func(42,7)模板参数语法,c++,templates,C++,Templates,下面的模板 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(); } 模板 整数计算(数据d,数字n){ 如果(n>10)缓慢(d) 如果(n

下面的模板

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();
} 
模板
整数计算(数据d,数字n){
如果(n>10)缓慢(d)
如果(n<30)昂贵(d)
如果(n<-10)…如果(…)//等等。
返回d.abc();
} 
有时使用动态计算的编号n调用:
compute(数据,运行时编号)
, 有时使用编译时已知参数:
compute(data,3)

如果我不相信编译器会优化后一种情况(有或没有内联),但相信它足以使
If(false)
块消失,我将不得不复制大量代码并编写
compute(data)
模板。除了代码复制之外,
compute(data,number)
使用起来更方便、更直观

有没有办法把这两者统一起来


编辑:这更多的是关于模板,或者模板滥用,如果你愿意的话,而不是关于编译器可以应用于这种情况的优化。

绝对不做任何事情。编译器足以优化所有内容。

在我看来,这里没有太多需要优化的内容。在最坏的情况下,你会得到一些额外的比较常数(每个1个周期)和可能的一个或两个分支。由于您提到根据结果调用函数
SLOW
priced
,因此这些优化根本没有任何区别。好的,这与这些函数无关,而与从代码中删除
if()…
块有关。除了轻量级比较函数外,还有分支预测失误的代价:存在大量的
if
子句(no
else
!),并且该函数经常被调用。如果纯函数速度慢且成本高,可能您可以缓存结果。@即使分支预测失误(~30个周期,可能?)也要加总如果这些函数真的很慢而且很昂贵的话,这是不相关的。是的,都是真的,但是让我们假设我真的关心速度:)。此外,我想了解更多的模板!