C++ 空指针参数有多贵?

C++ 空指针参数有多贵?,c++,c,performance,embedded,avr-gcc,C++,C,Performance,Embedded,Avr Gcc,在用C++(AVR Gcc)在嵌入式系统上实现菜单时,我使用了void函数指针,该指针接受参数,并通常使用参数 // void function prototype void (*auxFunc)(char *); 在某些情况下(事实上,很多情况下),函数实际上不需要参数,因此我会执行以下操作: if (something) doAuxFunc(NULL); 我知道我可以重载到一个不同的函数类型,但我实际上尝试不这样做,因为我正在实例化多个对象,并希望保持它们的轻量级 使用空指针调用多

在用C++(AVR Gcc)在嵌入式系统上实现菜单时,我使用了void函数指针,该指针接受参数,并通常使用参数

// void function prototype
void (*auxFunc)(char *);
在某些情况下(事实上,很多情况下),函数实际上不需要参数,因此我会执行以下操作:

if (something)    doAuxFunc(NULL);
我知道我可以重载到一个不同的函数类型,但我实际上尝试不这样做,因为我正在实例化多个对象,并希望保持它们的轻量级


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

即使在微控制器上检查空指针的开销也非常小-与0的比较应该是闪电般的快。如果您重载了多个函数,那么您将在可读性方面获得(非常轻微的)性能改进。让GCC的优化器做它自己的事情,它非常擅长:)

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

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


但是如果您认为您的接口由于重载而变得太复杂,并且您的函数很小,那么您应该将其声明为
inline
,并将其放在头中。然后,任何体面的现代编译器都可以轻松地优化检查
0

看看反汇编,它应该生成一个null(零)作为第一个参数传递,该参数会烧掉一个寄存器或堆栈位置,如果烧掉一个寄存器,那么如果调用函数缺少寄存器,则可能需要一次推送和弹出。(如果函数缺少寄存器以实现调用约定,仅使用函数调用可能会导致推送和弹出的代价)


因此,可能会有成本,但成本可能不足以改变您的做事方式。

探查器怎么说?为什么您认为重载“很重”?@KerrekSB主要是因为会有(相对)多个对象保存这些内容,而空间在嵌入式系统上很有价值。在这种情况下,菜单更像是项目主要功能的辅助部分。@falro:“主要是因为(相对而言)会有很多对象持有这些内容”--你知道重载只会创建两个实例而不是一个,即使是一百万个对象?并不是每个对象都拥有新的可执行代码副本。@Damon啊,是的,你说得对。我不认为是这样。因为这是一个嵌入式系统的解决方案,内联会导致使用更多的代码内存,在这种情况下,这也是很昂贵的。@syplex:这在很大程度上取决于函数调用和清理的大小。内联可以节省空间。当一个合理的优化器可以消除不必要的指令时,情况尤其如此。一个常见的简单示例是
Foo::getBar
方法,该方法提供对Foo中Bar成员的只读访问。这可能最终成为一个简单的指针偏移量计算,甚至可以与其他偏移量计算合并。gcc现在具有执行部分内联的功能。基本上,它将根据所有参数创建一个函数核心,然后内联可以恒定传播的部分。这没有太大的开销。