Кирюшык
>Ещё три раза проверил. Работает.
три раза? маловато.
надо проверить на всех более мене популярных платформах. на всех компиляторах. на всех версиях компиляторов. вот когда проверишь, тогда можешь смело говорить - работает.
кстати, в исходном посте не написано, что переменная имеет оператора -,+, ^
да и вообще, на современных процессорах эти хитроумные арифметические варианты будут значительно уступать по скорости копированию во временную переменную.
так что самый правильный вариант - std::swap(a, b)
NULL_PTR
Дошло, извиняюсь. Ступил поздно ночью, не подумал, что может сначала быть использован результат присваивания, а уже потом выполнена сама запись в переменную.
x ^= y ^= x ^= y;
Что это все про какой-то UBговорят? Все нормально будет. x и y поменяются...
alex19921992
Так UB на то и UB, что может нормально, а может и нет :)
Кошмар! Если ТАКИЕ вопросы задают а форуме ...
Вроде самого быстрого варианта ещё не было.
xchg eax,ecx
cppguru
Пост 19 :)
А слабО для общего случая (сложные классы и т. п.)? %)
Блин, народ, я все понял
Sbtrn. Devil
Мне не слабо! Реинтерпрет каст в помощь! Но понадобится ещё одна переменная))) Дык что быстрее через третюю.
С точки зрения асемблера эта процедура должна выполняться в два считывания и в две записи в память. Все зависит от тупости компилятора )
Sbtrn. Devil
>А слабО для общего случая (сложные классы и т. п.)? %)
А что, сложные классы кто-то обменивает по значению? ;)
cppguru
подозреваю, что
mov eax, [mem1]
mov ecx, [mem2]
mov [mem1], eax
mov [mem2], ecx
будет эффективнее
Чеширский кот
>Sbtrn. Devil
>А что, сложные классы кто-то обменивает по значению? ;)
Запросто! В стл для такого случая даже swap соорудили. 8)
Тема в архиве.