реализации подкачки: эффективность и диапазон применимости?

Я пытаюсь охватить все 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;
}

Я пытаюсь сравнить все существующие реализации и понять их диапазон применимости.

-1

Решение

Поведение первой функции не определено. Арифметика может привести к переполнению, а на некоторых машинах переполнения приводят к исключениям.

Стандарт гласит:

Если во время оценки выражения результат не определен математически или не находится в диапазоне
представимые значения для его типа, поведение не определено. [ Заметка: большинство существующих реализаций C ++
игнорировать целочисленные переполнения. …]

Хотя на практике у вас есть хорошие шансы, что функция будет работать, возможно, лучше ее избегать.

3

Другие решения


По вопросам рекламы [email protected]