函数指针数组与switch语句:哪种调用方式执行速度更快?
函数指针数组 vs switch语句:哪种调用速度更快?
两种实现方式
函数指针数组写法
typedef int (*p)(); p arr[] = {a, b, c, d};
调用方式:
arr[index]();
switch语句写法
switch(index){ case 1:{ a(); break; } case 2:{ b(); break; } case 3:{ c(); break; } case 4:{ d(); break; } }
速度对比分析
- 函数指针数组:调用复杂度为O(1),逻辑是通过索引直接取出数组中的函数指针,再执行间接调用。但这种方式无法做内联优化——编译器没法提前确定运行时会调用哪个函数,所以必然存在函数调用的固定开销。
- switch语句:
- 当case值是连续的小范围整数时,现代编译器会自动把switch优化成跳转表,此时和函数指针数组的调用逻辑几乎一致,也是O(1);如果case数量极少,编译器甚至会直接把函数调用内联到代码里,彻底消除函数调用的开销,这时候速度会比函数指针数组快很多。
- 如果case值不连续,编译器可能生成一系列条件判断(类似if-else链),此时复杂度变成O(n),速度就不如函数指针数组稳定。
总结
如果switch的case是连续的小范围值,编译器优化后的表现大概率优于函数指针数组(尤其是能内联的场景);如果case值零散不连续,函数指针数组的O(1)调用会更稳定高效。实际开发中,建议优先保证代码的可读性,再根据具体的性能测试结果做调整——现代编译器的优化能力很强,多数场景下两者的性能差距可以忽略不计。
内容的提问来源于stack exchange,提问作者limuy
相关产品推荐
相关产品推荐

