2012-09-06 12 views
7

Ho tre domande sullo scambio, molto probabilmente di base.Domande riguardanti le prestazioni dello scambio

(1) Per quanto riguarda le due contenitori stessi tipo STL a e b, entrambe le operazioni sotto funzionerebbero

swap(a,b); 
a.swap(b); 

comprendo che il secondo è specializzato per il contenitore (ad esempio, comporta solo un numero di iteratore swaps) mentre il primo è un algoritmo globale pensato per funzionare con i tipi di dati generici ed esegue un costrutto di copia interno.

La mia domanda è se scrivo il primo, il compilatore userà il secondo a prescindere, o devo fare attenzione a verificare se esiste una specializzazione appropriata?

(2) swap(a,b) corrisponde alla stessa prestazione con swap(b,a)? Se è coinvolto un copy-construct e gli oggetti hanno dimensioni considerevolmente diverse, sospetto che possa essere importante?

(3) Nei casi in cui l'operatore sovraccarico == esista ed è relativamente veloce, il controllo di a == b prima dello scambio avrebbe senso in modo da evitare operazioni non necessarie. std::swap applica prima questo controllo o esegue l'operazione indipendentemente?

Grazie per il vostro tempo!

risposta

7
  1. Il swap modello globale è specializzata per ognuno dei tipi di libreria standard che supporta swap; la specializzazione chiama il membro swap.

  2. Non ci dovrebbero essere differenze tra swap(a, b) e swap(b, a). (Posso immaginare tipi perversi in cui sarebbe importante, ma ciò non si verificherebbe mai nella pratica).

  3. No, std::swap in genere non controlla l'uguaglianza. In molti casi sarebbe più lento del semplice fare lo scambio.

+0

Non tutto dipende dall'implementazione specifica dell'STL? Non penso che tu possa ricavare nulla dallo standard. –

+1

Il numero 3 potrebbe essere dipendente dall'implementazione. 1 è esplicitamente richiesto. –

+0

Grazie mille per la pronta risposta. – Chrys