函数指针:从性能的角度来看,简单的规范使用是不是很糟糕?如果是这样,那么c ++ 11-ish替代品是什么?

use*_*035 4 c++ c++11

我在c++代码中经常使用函数指针,总是符合这个简单的规范示例(例如,函数具有相同的I/O,但所需的操作仅在运行时已知):

#include <iostream>
using namespace std;

int add(int first, int second){
    return first + second;
}
int subtract(int first, int second){
    return first - second;
}
int operation(int first, int second, int (*functocall)(int, int)){
    return (*functocall)(first, second);
}
int main(){
    int  a, b;
    int  (*plus)(int, int) = add;
    int (*minus)(int, int) = subtract;

    a = operation(7, 5, plus);
    b = operation(20, a, minus);
    cout << "a = " << a << " and b = " << b << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我刚才开始使用它只是因为我发现它使用起来更简单.当我更好地学习c ++时,我发现自己在想:在这种情况下,这种结构在性能方面是不是很糟糕?如果是这样,为什么以及哪些是更好的c++11选择呢?

从性能的角度来看,我找不到这个简单使用案例的准确指南(尽管有更多复杂案例的指导原则)

编辑:

我隐含地假设磨机x86硬件的运行.

Ste*_*tev 5

如果你真的担心性能,你应该考虑进行编译时调度 - 模板化操作; 这肯定适合你的简单例子; 不确定您的实际使用是否需要真正的运行时操作绑定(在这种情况下,此解决方案不起作用).

    template <typename Functor>
    int operation(int first, int second, Functor f)
    {
        return f(first, second);
    }

    ...

    a = operation(7, 5, std::plus<int> /* since C++14, roll your own otherwise */);
    b = operation(20, a, std::minus<int>);
Run Code Online (Sandbox Code Playgroud)

调用函数指针的性能开销肯定是不可忽略的,特别是对于像add()和subtract()这样简短的函数; 这就是为什么C++ std :: sort在简单的基本类型中胜过C的qsort例程的原因.