Я узнал, что операцию Xor можно использовать для реализации эффективной функции подкачки. нравится:
template<class T>
void swap(T& a, T& b)
{
a = a^b;
b = a^b;
a = a^b;
}
Но реализация свопа, которую я нашел в Интернете, по сути выглядит так:
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 во что-то более эффективное.)
XCHG reg, reg
можно было бы использовать, хотя я сомневаюсь, что это когда-либо понадобится - переименование регистров еще быстрее. Я написал несколько тысяч строк на ассемблере, и у меня никогда не возникало желания использоватьxchg
для замены значений. - person Gunther Piez   schedule 11.05.2012mov
s на моей машине. - person Joulukuusi   schedule 11.05.2012