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
子句(noelse
!),并且该函数经常被调用。如果纯函数速度慢且成本高,可能您可以缓存结果。@即使分支预测失误(~30个周期,可能?)也要加总如果这些函数真的很慢而且很昂贵的话,这是不相关的。是的,都是真的,但是让我们假设我真的关心速度:)。此外,我想了解更多的模板!