Мне было интересно, что самый эффективный, с точки зрения операций, способ обмена целыми числами в C ++ и почему? Это что-то вроде:
int a =..., b = ...;
a = a + b;
b = a - b;
a = a - b;
более эффективно, чем использование временного? Есть ли другие более эффективные способы? (не спрашивая просто о других способах замены ints) и почему они будут более эффективными?
Назначение значений всегда быстрее, чем выполнение арифметических операций.
Реализация C ++ для std :: swap is
template<typename T> void swap(T& t1, T& t2) {
T temp = std::move(t1); // or T temp(std::move(t1));
t1 = std::move(t2);
t2 = std::move(temp);
}
Поэтому использовать временную переменную лучше, чем делать арифметические трюки.
А использовать std :: swap еще лучше, потому что Изобретать колесо в программировании никогда не бывает хорошей идеей
Лучший способ — довериться компилятору а также используйте стандартные библиотечные функции C ++. Они предназначены друг для друга.
std::swap
Выиграет.
Вы могли бы использовать своп XOR для int
(который не требует временного), но в наши дни он все равно будет работать хуже, чем std::swap
,
В моем случае, std::swap
на 5% медленнее, чем следующее (оба с оптимизацией O3). В общем, функция std :: swap () вызывает конструктор копирования, который, вероятно, всегда будет медленнее, чем просто копирование части памяти.
#include <cstring>
size_t objectSize = sizeof(Object);
Object *temp = (Object *) malloc(objectSize);
loop {
loop {
memcpy(temp, a, objectSize);
memcpy(a, b, objectSize);
memcpy(b, temp, objectSize);
}
}
#include <iostream>
using namespace std;
void swap(int &a, int &b){
b = (a+b) - (a=b);
}
int main() {
int a=1,b=6;
swap(a,b);
cout<<a<<b;
return 0;
}