Nel suo Blog Herb Sutter scriveIl decremento atomico è più costoso dell'incremento?
[...] perché incrementare il conteggio dei riferimenti puntatore intelligente di solito può essere ottimizzato per essere lo stesso di un incremento ordinario in un ottimizzato
shared_ptr
implementazione - solo un incremento ordinaria istruzione, e nessuna recinzione, nel codice generato.Tuttavia, il decremento deve essere un decremento atomico o equivalente, che genera istruzioni speciali memoria del processore che sono più costosi in stessi, e che per di più indurre memoria restrizioni recinzione sull'ottimizzazione del codice circostante.
Il testo è di circa l'attuazione di shared_ptr
e io non sono sicuro se la sua osservazione si applica solo su questo o è generalmente il caso. Dalla sua formulazione ritengo che sia generalmente.
Ma quando ci penso, posso solo pensare a "decremento più costoso" quando segue immediatamente un if(counter==0)
- che probabilmente è il caso di shared_ptr
.
Perciò mi chiedo se il atomica operazione ++counter
è (di solito) sempre più veloce di quanto--counter
, o solo perché viene utilizzato if(--counter==0)...
con shared_ptr
?
* "Dalla sua formulazione ritengo che sia in generale" * - Tuttavia, raccolgo il contrario. –
Puoi anche dare un'occhiata alla barriera WriteRead che è richiesta per il --counter == 0, e che generalmente è la più costosa, in quanto è l'unico tipo di barriera che richiede che dopo aver scritto i dati deve essere riletto garantendo la sincronizzazione tra i core. Per counter ++ basta scrivere senza requisiti immediati per ottenere uno stato sincronizzato di questo valore o altri dati. –