使用函数指针数组而不是switch

使用函数指针数组和切换之间是否有任何区别。  ı编写了这样的代码

// Declaritons of add-substract-multiply funcitons

void (*fun_ptr_arr[])(int,int) = {add,subtract,multiply}; 
unsigned int ch,a = 15,b = 10; 

printf("Enter Choice: 0 for add,1 for subtract and 2 "
        "for multiply\n"); 
scanf("%d",&ch); 

if (ch > 2) return 0; 

(*fun_ptr_arr[ch])(a,b); 

,我想知道这段代码或使用开关会更好吗? (以效果为准)

chaoduncan 回答:使用函数指针数组而不是switch

带有相邻数字的switch语句通常在内部优化为函数指针查找表。

从历史上看,编译器对此并不擅长,并且函数指针表在过去总是更快。如今,对于任何一个版本,性能都不应该成为争论。实际上,手动函数指针表的一个缺点是编译器将无法内联函数,否则在优化switch时它可以做一些事情。

因此,您不应该使用函数指针版本,因为它更快/更慢,而是因为它可以提高代码的可读性和维护性。

例如,在实现有限状态机时通常使用此类函数指针表。另一方面,复杂的switch语句很难阅读,并且语法上存在各种古怪之处,例如缺少的break错误等。

最后,如果改为这样编写,则可以提高代码的可读性:

typedef void operation_t (int op1,int op2);  // function type

operation_t* const op_array[] = {add,subtract,multiply}; // read-only function pointer table

op_array[i](a,b); // call specific function
本文链接:https://www.f2er.com/3138490.html

大家都在问