Nauczyłem się, że operacja Xor może być używana do implementacji efektywnej funkcji wymiany. tak:Dlaczego zamień nie używaj operacji Xor w C++
template<class T>
void swap(T& a, T& b)
{
a = a^b;
b = a^b;
a = a^b;
}
Ale realizacja zamiany wszystko, co mogę znaleźć w internecie jest w zasadzie tak:
template<class T>
void swap(T& a, T& b)
{
T temp(a);
a = b;
b = temp;
}
Wydaje się, że kompilator nie wygeneruje ten sam kod dla dwóch postaci powyżej, ponieważ przetestowałem go na VC++ 2010, a pierwszy jest wykonywany szybciej (i jest szybszy niż std :: swap). Czy jest jakiś przenośny lub inny problem z pierwszym? Możesz poprawić mój błąd, ponieważ nie jestem Anglikiem i nie jestem dobry w C++.
Wystarczy założenie: przynajmniej procesory x86 mają [XCHG] (http://pdos.csail.mit.edu/6.828/2008/readings/i386/XCHG.htm), która jest szybsza niż trzy XOR. – Joulukuusi
Czy uruchomiłeś test z włączonymi optymalizacjami? –
@Joulukuusi Instrukcja XCHG na x86 nigdy nie miała być zamiennikiem wymiany. Posiada niejawny prefiks blokady, jeśli jest używany w operandach pamięci, jest używany jako narzędzie do synchronizacji. 'XCHG reg, reg' może być użyty, chociaż wątpię, czy kiedykolwiek jest potrzebny - zmiana nazwy rejestrów jest jeszcze szybsza. Napisałem kilka k linii montażowych, nigdy nie czułem potrzeby używania 'xchg' do zamiany wartości. – hirschhornsalz