首页 > 解决方案 > 使用函数指针数组代替开关

问题描述

使用函数指针数组和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); 

我想知道这里的代码或使用开关会更好吗?(就性能而言)

标签: cperformancepointersswitch-statement

解决方案


具有相邻数字的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

推荐阅读