我是否应该使用功能指针在构造函数中选择实现

Should I use a function pointer to select implementation in the constructor?

本文关键字:构造函数 选择 实现 指针 功能 是否      更新时间:2023-10-16

功能指针教程包含一个示例,该示例是如何替换函数指针的开关语句。

我有不同的算法,我想在构造函数中选择这些算法。我当前的实现基本上看起来像这样

// 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个时钟周期,具体取决于处理器。这称为分支 错误预测的罚款。

功能指针评估需要更长的时间:

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