在用C(++)(AVR-Gcc)实现嵌入式系统上的菜单时,我最终得到了带参数的void函数指针,并且通常会使用它们。
// void function prototype
void (*auxFunc)(char *);
在某些情况下(事实上很多),函数实际上不需要参数,所以我会做类似的事情:
if (something) doAuxFunc(NULL);
我知道我可以重载到不同的函数类型,但我实际上是在尝试不执行此操作,因为我实例化了多个对象并希望保持它们的亮度。
使用NULL指针调用多个函数(当它们用于实际指针时)比实现更多函数原型更糟糕吗?
答案 0 :(得分:9)
即使在微控制器上检查NULL也是一个非常小的开销 - 与0的比较应该是快速的。如果你使多个函数超载,你就会将可读性(十分轻微)的性能提升到十字架上。只是让GCC的优化器做它的东西,它很擅长:)
答案 1 :(得分:3)
看一下反汇编,它应该生成一个null(零)作为第一个参数传递,它会烧掉一个寄存器或一个堆栈位置,如果它烧掉一个寄存器那么它可能会花费你一个推送并弹出如果调用函数正在饿死寄存器。 (如果函数缺少寄存器以实现调用约定,那么仅使用函数调用可能会花费你的推送和弹出。)
所以可能有成本,但改变你做事的方式可能不足以付出代价。
答案 2 :(得分:2)
检查0
非常便宜,重载甚至更便宜,因为在编译时决定选择哪个函数。
但是如果你认为你的接口过于复杂而且你的功能很小,你应该声明它inline
并将它放在标题中。然后,任何体面的现代编译器都可以轻松地优化0
的Checkig。
答案 3 :(得分:1)
我认为"权衡"每种方法都低得离谱,但现在是时候为自己做基准了。如果您这样做,请发布一些结果:)