哪个更快:空函数调用或如果语句?

Shi*_*vam 7 c performance

我正在实现一个循环缓冲区来存储固定大小的数据结构,如队列.这个循环缓冲区初始化有三个参数: -

/*
 * Initialize the ring buffer.
 * @capacity Max capacity of ring buffer.
 * @item_size Fixed size of item that will be put in this circular buffer.
 * @item_cleaner Clean callback, NULL if cleanup not required.
 */
ringbuf*
ringbuf_create(size_t capacity, size_t item_size, clean_up_cb item_cleaner)
Run Code Online (Sandbox Code Playgroud)

我的循环缓冲区始终处于wrapping模式状态,这意味着当新项目放入完整循环缓冲区时,始终会替换最后一项.因为,动态分配的对象也可以放入此缓冲区,因此,循环缓冲区会保持引用清理回调函数,以便在替换或删除项目时释放它们.但与此同时,这个回调函数也可以NULL(当不需要清理时).在我的代码中的任何地方,我都有这样的陈述: -

if(buffer->callback != NULL)
   buffer->callback(item);
Run Code Online (Sandbox Code Playgroud)

现在,为了防止这些if语句,当用户没有提供任何回调函数时,我把空存根函数.这使我无法每次检查是否有回调函数NULL.

使用这种方法,我的代码看起来很整洁.但我不确定,哪一个更快?在装配层面,速度方面如何empty function callif statement相关?它们是等价的吗?

Mic*_*urr 5

不用担心速度,我可能只是编码:

 if (buffer->callback) buffer->callback(item);
Run Code Online (Sandbox Code Playgroud)

仅仅因为它是清晰和惯用的。它肯定不会比空函数调用慢。


Gil*_*lad 5

空存根函数实际上是 CPU 上的两次 JMP 操作和 PUSH/POP 操作的分配。IF 通常是单个 COMP 操作,比任何 JMP+PUSHS+POPS 便宜得多。

如果你的 'IF 通常返回 false/true,那么我不会担心它,因为只要 IF 是“可预测的”(通常返回 true 或 false 或具有某种模式),CPU 通过预测结果来以非常好的方式优化 IF真/假)

我会选择 IF。

  • 实际上,即使在“if”的情况下也会产生条件跳转指令。这就是“if”的真正含义:条件跳转。 (3认同)