功能指针教程包含一个示例,该示例是如何替换函数指针的开关语句。
我有不同的算法,我想在构造函数中选择这些算法。我当前的实现基本上看起来像这样
// 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语句来期望绩效增长吗?
简单答案:否。"如果"陈述在现代,高速,管道的处理器上需要忽略不计的时间。在此工作功能中需要很长时间,它都不是if语句(并且您应该基准/个人资料来找出花费时间 - 这是一种比投机性优化更有生产力的方法)。
在研究C 优化的本手册后,我想添加更多信息,为什么上述想法可能不起作用。
由于在施工时选择了布尔值,因此选择的分支永远不会改变。
在微处理器的情况下,分支指令通常采用0-2个时钟周期 做出了正确的预测。从分支错误预测中恢复所需的时间是 大约12-25个时钟周期,具体取决于处理器。这称为分支 错误预测的罚款。
功能指针评估需要更长的时间:
通过功能指针调用功能通常需要几个时钟周期 如果可以预测目标地址,请直接调用该功能。