Я пытаюсь охватить все swap
реализации функций.
В следующих реализациях swap
В функции нет необходимости во временной переменной для обмена значениями двух параметров:
void swapNoTemp1(int &a, int &b){
a = a + b;
b = a - b;
a = a - b;
}
или же
template <class T>
void swapNoTemp2(T& i, T& j){
i -= j;
j += i;
i = (j - i);
}
или же
void swapNoTemp3(int &a, int &b){
a ^= b;
b ^= a;
a ^= b;
}
что делает его более эффективным с точки зрения используемой памяти, чем:
void swap(int &a, int &b){
int temp = a;
a = b;
b = temp;
}
С другой стороны, swap
может быть реализовано с использованием:
void swapPointers(int *i, int *j) {
int t = *i;
*i = *j;
*j = t;
}
Я пытаюсь сравнить все существующие реализации и понять их диапазон применимости.
Поведение первой функции не определено. Арифметика может привести к переполнению, а на некоторых машинах переполнения приводят к исключениям.
Стандарт гласит:
Если во время оценки выражения результат не определен математически или не находится в диапазоне
представимые значения для его типа, поведение не определено. [ Заметка: большинство существующих реализаций C ++
игнорировать целочисленные переполнения. …]
Хотя на практике у вас есть хорошие шансы, что функция будет работать, возможно, лучше ее избегать.