我是否应该使用功能指针在构造函数中选择实现
Should I use a function pointer to select implementation in the constructor?
功能指针教程包含一个示例,该示例是如何替换函数指针的开关语句。
我有不同的算法,我想在构造函数中选择这些算法。我当前的实现基本上看起来像这样
// 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个时钟周期,具体取决于处理器。这称为分支 错误预测的罚款。
功能指针评估需要更长的时间:
通过功能指针调用功能通常需要几个时钟周期 如果可以预测目标地址,请直接调用该功能。
相关文章:
- 选择要调用的构造函数
- C++ 带有默认参数的结构,可选择在构造函数中更改
- C++:使用委托构造函数时选择"const char *"与"std::string&qu
- 为什么Visual Studio无法在模板类中选择正确的构造函数
- 如何根据 C++ 中的 cv 限定符选择构造函数
- 编译如何选择要拨打的构造函数
- 编译时构造函数选择
- Clang 和 GCC 在使用大括号表示法和initializer_list时在构造函数选择上存在分歧
- 未选择引用到数组的构造函数进行列表初始化
- 使用 std::function 时选择自动返回类型而不是构造函数的调用运算符
- 我是否应该使用功能指针在构造函数中选择实现
- 无法选择模板构造函数
- C++:如何根据条件选择构造函数
- 为什么选择复制构造函数而不是移动构造函数
- 编译器在移动和复制构造函数之间的选择
- RAII 在两个构造函数之间进行选择的方式
- 如何选择构造函数模板
- 当参数是引用时,可变模板构造函数选择失败
- 如何消除构造函数选择的强制转换
- 是否有可能编写一个抽象类,其中构造函数选择适当的子类在c++中实例化