производительность — самый эффективный способ обмена значениями Переполнение стека

Мне было интересно, что самый эффективный, с точки зрения операций, способ обмена целыми числами в C ++ и почему? Это что-то вроде:

int a =..., b = ...;
a = a + b;
b = a - b;
a = a - b;

более эффективно, чем использование временного? Есть ли другие более эффективные способы? (не спрашивая просто о других способах замены ints) и почему они будут более эффективными?

2

Решение

Назначение значений всегда быстрее, чем выполнение арифметических операций.

Реализация 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 еще лучше, потому что Изобретать колесо в программировании никогда не бывает хорошей идеей

3

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

Лучший способ — довериться компилятору а также используйте стандартные библиотечные функции C ++. Они предназначены друг для друга.

std::swap Выиграет.

Вы могли бы использовать своп XOR для int (который не требует временного), но в наши дни он все равно будет работать хуже, чем std::swap,

6

В моем случае, 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);
}
}
1

#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;
}
0
По вопросам рекламы [email protected]