NULL 指针参数有多贵
How expensive are NULL pointer arguments?
在C(++)(AVR-Gcc)的嵌入式系统上实现菜单时,我最终得到了接受参数的void函数指针,并且通常使用它们。
// void function prototype
void (*auxFunc)(char *);
在某些情况下(实际上是相当多的),该函数实际上不需要参数,所以我会做这样的事情:
if (something) doAuxFunc(NULL);
我知道我可以重载到不同的函数类型,但我实际上尽量不这样做,因为我正在实例化多个对象并希望使它们保持轻量级。
使用 NULL 指针调用多个函数(当它们用于实际指针时)是否比实现更多函数原型更糟糕?
即使在微控制器上,检查 NULL 的开销也非常小 - 与 0 的比较应该是闪电般的快。如果你重载了几个函数,你将把可读性钉在十字架上,以获得(非常轻微的)性能改进。只要让GCC的优化器做它的事情,它非常擅长:)
查看反汇编,它应该生成一个 null(零)作为第一个参数传递,该参数要么烧毁寄存器,要么烧毁堆栈位置,如果它烧毁寄存器,那么如果调用函数急需寄存器,则可能会花费您推送和弹出。 (仅使用函数调用可能会花费您的推送和弹出,如果函数需要寄存器以实现调用约定)。
所以可能会有成本,但可能不足以改变你做事的方式。
检查0
真的很便宜,重载甚至更便宜,因为它是在编译时决定选择哪个函数的。
但是,如果您认为您的接口因重载而变得过于复杂并且您的函数很小,您应该将其声明inline
并将其放在标头中。然后,Checkig for 0
可以很容易地被任何像样的现代编译器优化掉。
我认为每种方法的"权衡"都低得离谱,但现在是时候为自己做基准了。如果您这样做,请发布一些结果:)
相关文章:
- 使用指向成员的指针将成员函数作为参数传递
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 修改函数中的指针(将另一个指针作为参数传递)
- Clang bug?使用指针作为模板参数
- MSVC将仅移动结构参数解释为指针
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 如何使用非类型模板参数传入指向数组的指针
- 将成员函数指针作为参数传递给模板方法
- 匹配函数指针作为模板参数?
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 通过智能指针和转换对基本模板参数进行模板推导
- 为函数定义符号不明确的指针参数
- 使用引用与指针将数组作为参数传递
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 将函数参数完美转发到函数指针:按值传递呢?
- 保留函数指针模板参数
- 如何构造一个以可变参数指针函数作为成员的类?
- 指向对象的非类型模板参数指针
- c++ 使用 *& as 参数(指针乐趣,三级树方法)