内联函数指针以避免 if 语句
Inline function pointer to avoid if statement
在我的jpg解码器中,我有一个循环,其中有一个if语句,根据图像的不同,该语句将始终为真或始终为假。 我可以制作两个单独的函数来避免 if 语句,但我出于好奇想知道使用函数指针而不是 if 语句对效率的影响。 如果为 true,它将指向内联函数,如果为 false,它将指向空的内联函数。
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 语句?
"inline"关键字只是对编译器的提示,告诉它在组装时尝试将指令内联。 如果使用指向内联的函数指针,则无论如何都无法使用内联优化:
阅读:内联函数有地址吗?
如果你觉得 if 语句太慢了,你可以通过使用单独的 while 语句来完全消除它:
if (trueorfalse) {
while (kazillion) {
trueFunction();
dootherstuff();
}
} else {
while (kazillion) {
dootherstuff();
}
}
注意1:我并不是故意回答上述问题。如果有人想知道在上面的例子中,if语句和通过指针调用函数之间的速度更快,那么mbonneau给出了一个非常好的答案。
注意 2:以下是伪代码。
除了好奇心之外,我真的认为人们不应该问自己,在if语句和函数调用之间,优化他的代码有什么更快。增益肯定非常小,并且生成的代码可能会扭曲,从而影响可读性和维护。
对于我的研究,我确实关心性能,这是我必须坚持的基本概念。但我更关心代码维护,如果我必须在好的结构和轻微的优化之间做出选择,我肯定会选择好的结构。然后,如果是我,我会编写上面的代码如下(避免 if 语句),通过策略模式使用组合。
class MyStrategy {
public:
virtual void MyFunction( Stuff& ) = 0;
};
class StrategyOne : public MyStrategy {
public:
void MyFunction( Stuff& ); // do something
};
class StrategyTwo : public MyStrategy {
public:
void MyFunction( Stuff &stuff ) { } // do nothing, and if you
// change your mind it could
// do something later.
};
class jpg{
public:
jpg( MyStrategy& strat) : strat(strat) { }
void func( Stuff &stuff ) { return strat.MyFunction( stuff ); }
private:
...
MyStrategy strat;
}
main(){
jpg a( new StrategyOne );
jpg b( new StrategyTwo );
vector<jpg> v { a, b };
for( auto e : v )
{
e.func();
dootherstuff();
}
}
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 以在Qt中的IF语句中设置时间延迟
- Craps游戏问题,忽略if语句
- c++:定义if语句中的模板
- C++嵌套的 If 语句中,它无法按预期工作
- 如果条件不相关,我应该更喜欢两个 if 语句而不是 if-else 语句吗?
- 需要有关此 if 语句的帮助
- 转换器练习:跳过 if 语句和 if 语句
- 避免在 C++ 中的 if 语句中递增
- 如果仍然不满足要求,如何使 if 语句重复?
- do while 循环中的 if 语句以 yes 或 no 结尾
- 为什么在此C++代码中触发此 if 语句?
- 如何基于平台在制作文件中制作if语句?
- 在 if 语句中使用 GetKeyState 时,它会跳过条件
- C++ If 语句,从其他语句重复