7

在用 C(++) (AVR-Gcc) 在嵌入式系统上实现菜单时,我最终得到了带有参数的 void 函数指针,并且通常会使用它们。

// void function prototype
void (*auxFunc)(char *);

在某些情况下(实际上不少),该函数实际上不需要参数,所以我会这样做:

if (something)    doAuxFunc(NULL);

我知道我可以重载到不同的函数类型,但实际上我试图不这样做,因为我正在实例化多个对象并希望它们保持轻便。

使用 NULL 指针调用多个函数(当它们用于实际指针时)是否比实现更多函数原型更糟糕?

4

4 回答 4

9

即使在微控制器上检查 NULL 也是非常小的开销 - 与 0 的比较应该是闪电般的快。如果你重载了几个函数,你会为了(非常轻微的)性能改进而牺牲可读性。只需让 GCC 的优化器完成它的工作,它就很擅长了 :)

于 2012-08-13T14:50:08.743 回答
3

看看反汇编,它应该生成一个空(零)作为第一个参数传递,它要么烧录一个寄存器,要么烧一个堆栈位置,如果它烧一个寄存器,那么如果调用函数是,它可能会花费你一个 push 和 pop渴望寄存器。(如果函数为了实现调用约定而急需寄存器,则仅使用函数调用可能会花费您推送和弹出的费用)。

所以可能会有成本,但可能不足以改变你做事的方式。

于 2012-08-13T17:24:59.637 回答
2

检查0真的很便宜,重载甚至更便宜,因为在编译时决定选择哪个函数。

但是,如果您认为您的接口因重载而变得过于复杂并且您的函数很小,您应该声明它inline并将其放在头文件中。Checkig for0然后可以很容易地被任何体面的现代编译器优化掉。

于 2012-08-13T15:23:49.060 回答
1

我认为每种方法的“权衡”都非常低,但现在是为自己做基准测试的时候了。如果你这样做,请发布一些结果:)

于 2012-08-13T14:51:23.833 回答