【发布时间】:2020-03-05 00:14:30
【问题描述】:
使用函数指针数组和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);
我想知道这里的代码或使用开关会更好吗? (就性能而言)
【问题讨论】:
-
在性能方面?您必须对其进行基准测试。我的猜测是,性能差异将比 IO 绑定
printf和scanf调用的运行时间低几个数量级。一般fun_ptr_arr[ch]有固定的runtime,switch可以编译成跳转表,也有固定的runtime。 -
请注意,您检查
ch是否大于2,但您也应该检查它是否小于0(或者在您应该使用无符号整数时停止使用有符号整数!) -
你没有在这里检查负值。如果你这样做了,那么它们在外部行为上都是 equal 的,这取决于编译器的实现。见as-if rule。
-
您可能不应该打扰,差异很可能很小,不值得担心。而且编译器现在很聪明,它们可能会进行您甚至无法想象的优化。
标签: c performance pointers switch-statement