2015-11-16 7 views
12

Dopo aver letto this circa l'idioma di copia e di scambio che ho letto this che dice sotto (2):Quando è linguaggio copia-e-swap non applicabile

class_name & class_name :: operator= (const class_name &)  (2)  

(2) Dichiarazione tipico di una copia operatore di assegnamento quando copia-e-swap linguaggio non può essere utilizzato

quando dobbiamo evitare di usare l'idioma di copia e-swap?

E quando "non può essere utilizzato" del tutto?

Esistono casi di vita reale in cui sia la copia e lo swap che la regola zero non sono applicabili?

Ho trovato questo question ma era troppo specifico e non includeva alcuna linea guida su come identificare tali casi.

+0

In genere, copy-and-swap è * facile * e * sicuro *, ma forse non ottimale da una prospettiva di velocità. Ad esempio, assegnando due contenitori di un milione di elementi, è probabilmente più veloce eseguire un milione di assegnazioni che eseguire un milione di costruzioni e un milione di distruzioni. –

+3

@ user2079303 grazie, quella frase era ubriaca doveva andare a casa. Spero che ora sia più chiaro – Darius

+1

Casi reali in cui copiare/scambiare uccide le tue prestazioni: http://stackoverflow.com/a/25942402/576911 –

risposta

7

Quando dovremmo evitare di utilizzare l'idioma di copia e scambio?

Quando è possibile dimostrare che la copia originale è sicura e più veloce di swap.

È possibile identificare il caso in cui non sono presenti puntatori membri (né intelligenti né grezzi) che possiedono oggetti e lo stesso vale per tutti gli oggetti membri.

E quando "non può essere utilizzato" del tutto?

Non è possibile utilizzare la funzione di copia e scambio quando il tipo non è swappable.

Per poter essere scambiati, il tipo deve essere trasloco-costruibile e trasferibile, oppure è necessario aver definito una funzione membro swap o una funzione amico.

2

Il link che descrive le potenziali implementazioni di un operatore di assegnazione descritto class_name& class_name::operator=(class_name) come:

tipica dichiarazione di un operatore di assegnamento per copia quando idioma copia-e-swap può essere utilizzato

E class_name& class_name::operator=(const class_name&) come :

Tipica dichiarazione di un operatore di assegnazione copia quando non è possibile utilizzare il linguaggio copia e swap

Fondamentalmente abbiamo sarebbe sempre desidera utilizzare la copia-e-swap, quando possibile, come indicato nel excellent answer to your linked question, perché passerà il test di auto-assegnazione.

Quindi ora la domanda è perché la convenzione menzionata su http://www.cppreference.com?

Diciamo che sto implementando un costruttore di copia in una classe virtuale, e voglio chiarire a chiunque erediti che dovrebbero usare l'idioma copy-and-swap. Come potrei farlo?li ho potuto fare facendo la copia per loro nella chiamata iniziale:

class_name& class_name::operator=(class_name) 

Questa è una copia per valore, per cui il realizzatore di tutte le classi bambino avrebbe vedere che ho già fatto la copia per loro in modo tutto dovranno fare lo scambio.

Ora, cosa succede se ho un class_name che conteneva un membro che non può essere copiato, ad esempio cosa succede se la mia classe ha un unique_ptr tale da non poter essere copiato. Posso indicare che da non fare una copia per argomento valore al l'operatore di assegnazione, ad esempio:

class_name& class_name::operator(const class_name&) 

indicando che sarà in realizzatore di tutte le classi figlio al fine di garantire che il controllo sufficiente è fatto per passare il sé -assegno di assegnazione.

Problemi correlati