我正在实现一个循环缓冲区来存储固定大小的数据结构,如队列。这个循环缓冲区用三个参数初始化:-
/*
* 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)
我的循环缓冲区始终处于wrapping
模式,这意味着当新项目放入完整的循环缓冲区时,最后一项总是被替换。由于动态分配的对象也可以放入这个缓冲区,因此循环缓冲区会保持引用一个清理回调函数,以便在替换或删除项目时释放它们。但同时这个回调函数也可以NULL
(不需要清理的时候)。在我的代码的任何地方,我都有这样的陈述:-
if(buffer->callback != NULL)
buffer->callback(item);
现在,为了防止这些if
声明,当用户不提供任何回调函数时,我放置了空存根函数。这阻止我每次检查回调函数是否NULL
存在。
使用这种方法,我的代码看起来很整洁。但我不确定,其中哪一个更快?在装配层面上,empty function call
在if statement
速度方面有什么关系?它们是等价的吗?