XOR Swap jest złe!


Trick XOR swap

Kilka słów o pewnym triku, który jest bardzo zły!

Mamy napisać funkcję, która zamienia miejscami dwie zmienne (funkcje swap). Nic prostszego:

A teraz załóżmy, że mamy dodatkowe wymaganie, aby nie korzystać ze zmiennej tymczasowej, czyli swap w miejscu. Jako przykład rozwiązania takiego problemu podaje się poniższy kod:

Podany wyżej kod pojawia się w wielu sytuacjach: jako ciekawostka, jako trik na przyśpieszenie kodu oraz w pytaniach rekrutacyjnych. I niby wszystko funkcjonuje poprawnie. Podstawiamy dwie liczby i działa:

Wyjaśnienie, dlaczego xor swap jest złe

Co wiec jest złego z xor_swap? A możne nic? Może to fajna implementacja? Kluczowe pytanie to to, czy dwie podane niżej funkcje działają identycznie?

Problem jest taki, że gdy przekazane referencje będą odnosić się do tego samego obszaru pamięci, wówczas funkcja xor_swap nam ten obszar pamięci wyzeruje!  Podane powyżej dwie implementacje nie są tożsame. Dla typów wartościowych faktycznie ich działanie jest identyczne, ale dla typów wskaźnikowych istnieje przypadek szczególny, gdy xor_swap zachowuje się inaczej niż tego oczekujemy.

Czytelniku, czy zgadzasz się ze mną ze gdy mamy dobrego dobrego gotowca std::swap, to nie warto tracić czasu na takie drobnostki jak swap?

Dodaj komentarz

Twój adres email nie zostanie opublikowany.