我应该使用函数指针来选择构造函数中的实现吗?

时间:2014-03-06 15:31:41

标签: c++ function-pointers

函数指针教程包含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语句来获得性能提升吗?

2 个答案:

答案 0 :(得分:2)

简单回答:不。 '如果'语句在现代高速流水线处理器上花费的时间可以忽略不计。无论在这个工作函数中需要很长时间,它都不是if语句(你应该通过基准测试/剖析来找出花费时间的东西 - 这是一种比投机优化更有效的方法)。

答案 1 :(得分:0)

在研究了这个manual on c++ optimization后,我想补充一些信息,说明为什么上述想法可能不起作用。

由于在构造时选择了bool值,因此选择的分支将永远不会改变。

  

在微处理器的情况下,分支指令通常需要0-2个时钟周期   做出了正确的预测。从分支错误预测中恢复所需的时间是   大约12 - 25个时钟周期,具体取决于处理器。这称为分支   错误预测惩罚。

函数指针评估需要更长时间:

  

通过函数指针调用函数通常需要几个时钟周期   如果可以预测目标地址,则直接调用该函数。