2014-06-05 8 views
5

(Dies kann eine allgemeine Frage für die Atom Inkrement/Dekrement sein, aber ich habe die Situation im Bereich der shared_ptrs angetroffen)Treten shared_ptrs aufgrund von Referenzzählern auf atomare Inkremente/Dekremente auf?

Hat ein shared_ptr Begegnung zwei Cache-Zeile fehlt/accesses- wenn das Atomreferenzzähler erhöht und erniedrigt ?

ich dies fand:

atomic operation cost

aber es scheint nicht allzu schlüssig zu sein ....

UPDATE:

Wenn ich eine Schleife Millionen laufen von Zeiten, inkrementieren eine atomare Variable ich bekomme eine L1-Cache-Miss-Rate von 0,2. Wenn ich dasselbe mit einem nicht-atomaren Int mache, bekomme ich 0 L1 Cache-Fehltreffer-Rate .....

Der Test würde bedeuten, dass die L1-Cache-Zeile entfernt wird.

+0

Sorry, es ist kein Nswer. Ich bin kein Experte in atomaren Operationen, werde ich nicht streiten, wie teuer sie sind. Ich könnte jedoch darüber diskutieren, ob diese Operation überhaupt aufgerufen wird. Ich frage mich, in welchem ​​Szenario spielt es für Sie eine Rolle? Wenn der Zeiger mit make_shared erstellt wurde, wird offensichtlich die Cache-Zeile mit der Referenz gelesen und die Daten werden einmal gelesen, also könnte man sagen, es ist ein Cache-Fehler weniger. Als nächstes wird dank des move-Operators die Referenzanzahl nicht geändert, wenn shared_ptr bewegt wird (z. B. die Größe von std :: vector ). – biocomp

+0

Das stimmt nicht ganz. Wenn Ihr Objekt größer als cache_line_size ist und Sie ein Datenelement lesen, das am Anfang deklariert wurde, erhalten Sie zwei Cachezeilenlesevorgänge. – user997112

+0

Sie haben Recht) Obwohl ich denke, dass es ein seltener Fall ist. – biocomp

Antwort

0

shared_ptr muss die Referenzzählvariable irgendwo speichern. Es wird wahrscheinlich vom Heap zugewiesen und der shared_ptr enthält einen Zeiger auf diese Variable.

Es ist durchaus möglich, dass der Zugriff auf diese Variable zu Cache-Operationen führt, wenn nicht sorgfältig darauf geachtet wurde, sie in die gleichen Blöcke zu setzen, was sehr unwahrscheinlich ist.

Wenn Sie Bedenken hinsichtlich der Auswirkungen auf die Leistung haben, erstellen Sie eine Klasse mit einer Ganzzahl zum Zählen von Referenzen, einer benutzerdefinierten Zeigerklasse, die sie verwendet, und leiten Sie jede Klasse, die Sie so verwalten möchten, aus Ihrer Referenzzählklasse.