我在我的c代码中经常使用函数指针,总是符合这个简单的规范示例(例如,函数具有相同的I / O,但所需的操作仅在运行时已知): #include iostreamusing namespace std;int add(int first, int second){ return
#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).因此,您的指导性示例可能优于实际代码,在该代码中,直到运行时才会确定传递给操作的函数指针.