キューのような固定サイズのデータ構造を格納する循環バッファーを実装していました。この循環バッファーは、3 つのパラメーターで初期化されます。
/*
* 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
それらは同等ですか?