NULL 指针参数有多贵

How expensive are NULL pointer arguments?

本文关键字:参数 指针 NULL      更新时间:2023-10-16

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

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

在某些情况下(实际上是相当多的),该函数实际上不需要参数,所以我会做这样的事情:

if (something)    doAuxFunc(NULL);

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

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

即使在微控制器上,检查 NULL 的开销也非常小 - 与 0 的比较应该是闪电般的快。如果你重载了几个函数,你将把可读性钉在十字架上,以获得(非常轻微的)性能改进。只要让GCC的优化器做它的事情,它非常擅长:)

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

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

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

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

我认为每种方法的"权衡"都低得离谱,但现在是时候为自己做基准了。如果您这样做,请发布一些结果:)