gpt4 book ai didi

c++ - 内联函数指针以避免 if 语句

转载 作者:可可西里 更新时间:2023-11-01 18:28:12 27 4
gpt4 key购买 nike

在我的 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 语句慢。

我已经分析了我的程序,虽然我预计在运行我的程序时会以一种或另一种方式出现明显的差异......但我没有遇到明显的差异。所以我只是出于好奇想知道。

最佳答案

if 语句很可能比调用函数更快,因为 if 只是一个短跳转,而不是函数调用的开销。

这已在此处讨论:Which one is faster ? Function call or Conditional if Statement?

“inline”关键字只是对编译器的提示,告诉它在汇编时尽量将指令放入内联。如果您使用指向内联的函数指针,则无论如何都不能使用内联优化:

阅读:Do inline functions have addresses?

如果您觉得 if 语句太慢了,您可以通过使用单独的 while 语句来完全消除它:

if (trueorfalse) {
while (kazillion) {
trueFunction();
dootherstuff();
}
} else {
while (kazillion) {
dootherstuff();
}
}

关于c++ - 内联函数指针以避免 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22903089/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com