STL implementa una funzione generica std::swap
per scambiare 2 valori. Può essere presentata nel modo seguente:Quanto è veloce std :: swap per i tipi interi?
template <class T> void swap (T& a, T& b)
{
T c(std::move(a));
a=std::move(b);
b=std::move(c);
}
Tuttavia, c'è un algoritmo XOR di swap per scambiare 2 numeri interi (http://en.wikipedia.org/wiki/XOR_swap_algorithm):
void swap_u(size_t& x, size_t& y)
{
x = x^y;
y = x^y;
x = x^y;
}
Le mie domande:
- È un'ottimizzazione al giorno d'oggi (su
x86
oarm
)? - Lo standard C++ favorisce questo tipo di ottimizzazione?
- Esistono implementazioni STL reali in natura che hanno la specializzazione
std::swap
per i numeri interi?
Lo scambio XOR non è necessariamente efficiente: è più una novità che una ottimizzazione utile: basta usare una variabile temporanea, mantenerla semplice ed evitare espedienti - lasciare che il compilatore faccia le cose intelligenti. –
La seconda implementazione non funzionerà se x e y puntano allo stesso indirizzo di memoria (potrebbe accadere se passi elementi di array con indici variabili). – sudeepdino008
Scambiare usando un registro per un temporaneo dovrebbe essere più veloce. E questo è ciò che il compilatore deve fare nel primo caso. – lapk