Какой самый быстрый способ поменять значения в C? - PullRequest
52 голосов
/ 31 августа 2008

Я хочу поменять местами два целых числа и узнать, какая из этих двух реализаций будет быстрее: Очевидный способ с временной переменной:

void swap(int* a, int* b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

Или версия xor, которую, я уверен, большинство людей видели:

void swap(int* a, int* b)
{
    *a ^= *b;
    *b ^= *a;
    *a ^= *b;
}

Кажется, что первый использует дополнительный регистр, но второй выполняет три загрузки и сохраняет, в то время как первый делает только два из каждого. Может кто-нибудь сказать мне, что быстрее и почему? Почему важнее.

Ответы [ 21 ]

0 голосов
/ 05 сентября 2008

Я просто поместил оба свопа (в виде макросов) в рукописную сортировку, с которой я играл. Версия XOR была намного быстрее (0,1 с), чем версия с временной переменной (0,6 с). Однако XOR повредил данные в массиве (вероятно, тот же адрес, что и Ant).

Поскольку это была быстрая сводная сортировка, скорость версии XOR, вероятно, обусловлена ​​тем, что большие части массива были одинаковыми. Я попробовал третью версию свопа, которая была самой легкой для понимания и имела то же время, что и временная версия.


acopy=a;
bcopy=b;
a=bcopy;
b=acopy;

[Я просто помещаю операторы if в каждый своп, чтобы он не пытался поменяться с самим собой, и теперь XOR занимает то же время, что и остальные (0,6 с)]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...