使用函数指针数组代替开关

问题描述 投票:-2回答:1

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

// 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); 

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

c performance pointers switch-statement
1个回答
0
投票

带有相邻数字的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
© www.soinside.com 2019 - 2024. All rights reserved.