Почему swap не использует операцию Xor в C++

Я узнал, что операцию Xor можно использовать для реализации эффективной функции подкачки.вот так:

template<class T>
void swap(T& a, T& b)
{
    a = a^b;
    b = a^b;
    a = a^b;
}

Но реализация swap, которую я нашел в Интернете, по существу такая:

template<class T>
void swap(T& a, T& b)
{
    T temp(a);
    a = b;
    b = temp;
}

Похоже, что компилятор не сгенерировал один и тот же код для двух вышеприведенных форм, потому что я тестировал его на VC++ 2010. и первый выполняется быстрее, чем std::swap. Есть ли портативные или какие-либо другие проблемы с первым? Не стесняйтесь исправлять любую мою ошибку, потому что я не являюсь носителем английского языка и плохо разбираюсь в C++.

(Примечание редактора: скорее всего, этот тест проводился с неоптимизированной отладочной сборкой, а не с выпускной сборкой, в которую может быть встроен std::swap. Сравнительный анализ отладочных сборок не имеет смысла. Компиляторы обычно не оптимизируют xor-swap на что-то более эффективное.)

11
задан Peter Cordes 27 October 2019 в 20:58
поделиться