w Jego Blog Herb Sutter piszeCzy dekompresja atomowa jest droższa niż inkrementacja?
[...] ponieważ zwiększając liczbę odwołań inteligentny wskaźnik można zwykle zoptymalizowany być taka sama jak zwykłego przyrostu w zoptymalizowanym
shared_ptr
realizacji - po prostu zwykły przyrost instrukcja, i bez ogrodzeń, w wygenerowanym kodzie.Jednakże zachodzi spadek musi się ubytek atomowej lub jej odpowiednik, który generuje specjalne instrukcje pamięci procesora, które są droższe w siebie, i że w górnej części, które indukują pamięć ograniczeń ogrodzenia na optymalizację otaczającą kodu.
Tekst dotyczy implementacji shared_ptr
i nie jestem pewien, czy jego uwaga dotyczy wyłącznie tego czy ogólnie. Z jego sformułowania wynika, że jest to ogólnie.
Ale kiedy o tym myślę, mogę myśleć tylko o "droższym ubytku", gdy natychmiast następuje if(counter==0)
- co prawdopodobnie ma miejsce w przypadku shared_ptr
.
Dlatego zastanawiam się, czy atomowy operacja ++counter
jest (zazwyczaj) zawsze szybciej niż --counter
, lub po prostu dlatego, że jest on używanyif(--counter==0)...
z shared_ptr
?
* "Z jego sformułowania rozumiem, że jest ogólnie" * - Z drugiej strony jednak uważam inaczej. –
Możesz również rzucić okiem na barierę WriteRead, która jest wymagana dla licznika == 0, i która z reguły jest najdroższa, ponieważ jest to jedyna bariera, która wymaga tego zaraz po zapisaniu danych. należy ponownie odczytać, gwarantując synchronizację między rdzeniami. W przypadku licznika ++ wystarczy napisać bez natychmiastowego wymogu uzyskania zsynchronizowanego stanu tej wartości lub innych danych. –