In seiner Blog Herb Sutter schreibtIst Atom-Dekrementierung teurer als Inkrementieren?
[...] weil die Smart-Pointer-Referenzzähler Inkrementieren in der Regel optimiert werden kann das gleiche wie ein gewöhnlicher Zuwachs in einer optimierten
shared_ptr
Implementierung zu sein - nur ein gewöhnlicher Zuwachs Anweisung, und keine Zäune, in dem generierten Code.jedoch das Dekrement muß ein atomares Dekrement sein oder gleichwertig, welche Befehle speziellen Prozessorspeicher erzeugt, die teurer sind in selbst, und dass auf der Oberseite, die auf die Optimierung der umgebenden Kodespeicher fence Beschränkungen induzieren.
Der Text ist über die Umsetzung von shared_ptr
und ich bin mir nicht sicher, ob seine Bemerkung gilt nur für diese oder ist im Allgemeinen der Fall. Aus seiner Formulierung entnehme ich, dass es allgemein ist.
Aber wenn ich darüber nachdenke, kann ich nur an "teurere Dekremente" denken, wenn sofort ein if(counter==0)
folgt - was wahrscheinlich der Fall ist mit shared_ptr
.
Deshalb frage ich mich, wenn der Atom Betrieb ++counter
ist (in der Regel) immer schneller als --counter
, oder gerade weil ist es if(--counter==0)...
mit shared_ptr
verwendet?
* "Von seiner Formulierung, die ich erfahre, ist es allgemein" * - ich nehme jedoch das Gegenteil fest. –
Sie können auch die WriteRead-Barriere betrachten, die für den --counter == 0 erforderlich ist und die in der Regel die teuerste ist, da dies die einzige Art von Barriere ist, die direkt nach dem Schreiben der Daten erforderlich ist muss neu gelesen werden, um die Synchronisation zwischen den Kernen zu gewährleisten. Für Zähler ++ schreiben Sie einfach, ohne dass Sie sofort einen synchronisierten Zustand dieses Wertes oder anderer Daten benötigen. –