当前位置 : 主页 > 网络安全 > 测试自动化 >

函数指针:从性能的角度来看,简单的规范使用是不是很糟糕?如果是这样,那么

来源:互联网 收集:自由互联 发布时间:2021-06-22
我在我的c代码中经常使用函数指针,总是符合这个简单的规范示例(例如,函数具有相同的I / O,但所需的操作仅在运行时已知): #include iostreamusing namespace std;int add(int first, int second){ return
我在我的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;
}

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

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

编辑:

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

当然,您必须配置文件,但一般来说,通过函数指针调用的性能难度是编译器无法为您提供内联的好处.这样的事情可能会更快:

enum FuncTodo{
    PLUS,
    MINUS,
};

int operation(int first, int second, FuncTodo todo) {
    switch(todo) {
        case PLUS: return first + second;
        case MINUS: return first - second;
    }
}

当然,这在您的使用中可能是不可能的(如果您希望在编写和编译函数操作之后通过添加新操作来扩展代码),即使可能,您也可能认为它不太可维护.

最后,当你做个人资料时要小心.在您的示例中,编译器原则上可以计算出每个调用的实际目标(使用plus调用操作,但编译器可以“知道”plus的值实际上是add).因此,您的指导性示例可能优于实际代码,在该代码中,直到运行时才会确定传递给操作的函数指针.

网友评论