【发布时间】:2014-04-07 03:24:11
【问题描述】:
在我的 jpg 解码器中,我有一个带有 if 语句的循环,根据图像,该语句将始终为真或始终为假。我可以创建两个单独的函数来避免 if 语句,但出于好奇,我想知道使用函数指针而不是 if 语句会对效率产生什么影响。如果为真,它将指向内联函数,如果为假,它将指向一个空的内联函数。
class jpg{
private:
// emtpy function
void inline nothing();
// real function
void inline function();
// pointer to inline function
void (jpg::*functionptr)() = nullptr;
}
jpg::nothing(){}
main(){
functionptr = &jpg::nothing;
if(trueorfalse){
functionptr = &jpg::function;
}
while(kazillion){
(this->*functionptr)();
dootherstuff();
}
}
这会比 if 语句更快吗? 我的猜测是否定的,因为内联将毫无用处,因为编译器在编译时不知道要内联哪个函数并且函数指针地址解析比 if 语句慢。
我已经对我的程序进行了概要分析,虽然我在运行我的程序时预计会有明显的不同...但我没有遇到明显的不同。所以我只是出于好奇而想知道。
【问题讨论】:
-
你知道branch prediction吗?这是给你的吗?
-
我意识到我应该完全避免使用 if 语句,因为它始终为真或永远为假。
-
@deanresin,你应该按照你的命名约定:
trueorfalse,dootherstuff。 -
@deanresin 我并不是在争论避免
if语句或将循环放入其中,正如 mbonneau 所建议的那样;我只是建议分支预测可以解释为什么你没有看到太大的差异。 (嗯,这可能是if语句和指针解析比您所描述的函数体轻量级的事实。) -
@Mike 我认为你对我的 if 语句/指针解析相对于函数体的其余部分的重要性是正确的。另外.. 并且解释一下.. 我没有注意到差异可能是因为 CPU 的分支预测正在减轻任何潜在的减速。
标签: c++ optimization function-pointers inline