Ich habe einen Ringpuffer implementiert, um Datenstrukturen fester Größe wie eine Warteschlange zu speichern. Dieser Ringpuffer wird mit drei Parametern initialisiert:-
/*
* 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)
Mein Ringspeicher ist immer in wrapping
Modus, was bedeutet, dass das letzte Element immer ersetzt wird, wenn ein neues Element in den vollen Ringspeicher eingefügt wird. Da auch dynamisch zugewiesene Objekte in diesen Puffer eingefügt werden können, verweist der Ringpuffer auf eine Aufräumfunktion, um die Elemente freizugeben, wenn sie ersetzt oder gelöscht werden. Gleichzeitig kann diese Rückruffunktion aber auch NULL
(wenn keine Aufräumarbeiten erforderlich sind). Überall in meinem Code habe ich Anweisungen wie diese:-
if(buffer->callback != NULL)
buffer->callback(item);
Um diese zu verhindern if
Anweisung lege ich eine leere Stub-Funktion an, wenn der Benutzer keine Callback-Funktion bereitstellt. Das verhindert, dass ich jedes Mal prüfen muss, ob die Rückruffunktion NULL
oder nicht.
Mit diesem Ansatz sieht mein Code für mich ordentlich aus. Aber ich bin mir nicht sicher, welche der beiden Methoden schneller ist. Wie sieht es auf Assembly-Ebene aus? empty function call
y if statement
in Bezug auf die Geschwindigkeit? Sind sie gleichwertig?