函数指针教程包含example of how to replace a switch statement by function pointers。
我想在构造函数中选择不同的算法。 我目前的实现基本上看起来像这样
// Constructor:
MyClass::MyClass(double *data)
: specialCase1(false), specialCase2(false), data_(data) {
if (checkData1(data)) specialCase1 = true;
else if (checkData2(data)) specialCase2 = true;
}
// Function:
double MyClass::work() {
if (specialCase1) return workSpecialCase1();
else if (specialCase2) return workSpecialCase2();
// ... do work ...
}
工作函数被称为很多,因此我正在研究优化方法。原则上我可以在类'double(* selectedWorkFunc)()'中添加一个函数指针成员,然后将工作函数更改为
double MyClass::work() {
return selectedWorkFunc()
}
通常,我可以通过使用函数指针来避免工作函数中的if语句来获得性能提升吗?
答案 0 :(得分:2)
简单回答:不。 '如果'语句在现代高速流水线处理器上花费的时间可以忽略不计。无论在这个工作函数中需要很长时间,它都不是if语句(你应该通过基准测试/剖析来找出花费时间的东西 - 这是一种比投机优化更有效的方法)。
答案 1 :(得分:0)
在研究了这个manual on c++ optimization后,我想补充一些信息,说明为什么上述想法可能不起作用。
由于在构造时选择了bool值,因此选择的分支将永远不会改变。
在微处理器的情况下,分支指令通常需要0-2个时钟周期 做出了正确的预测。从分支错误预测中恢复所需的时间是 大约12 - 25个时钟周期,具体取决于处理器。这称为分支 错误预测惩罚。
函数指针评估需要更长时间:
通过函数指针调用函数通常需要几个时钟周期 如果可以预测目标地址,则直接调用该函数。