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

我正在实现一个循环缓冲区来存储固定大小的数据结构,如队列.这个循环缓冲区初始化有三个参数: –
/*
 * 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)

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

if(buffer->callback != NULL)
   buffer->callback(item);

现在,为了防止这些if语句,我在用户不提供任何回调函数时放入空存根函数.如果回调函数为NULL,这会阻止我每次检查.

使用这种方法,我的代码看起来很整洁.但我不确定,哪一个更快?在汇编级别,空函数调用和if语句如何在速度方面相关?它们是等价的吗?

解决方法

空存根函数实际上是两个JMP操作,并在cpu上分配PUSH / POP操作. IF通常是单个COMP操作,比任何JMP PUSHS POPS便宜得多.

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

我会选择IF.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...