
Сообщение от
Harutyunyan
Мне просто на собесодовании среди задач попалась и такая, надо поменять значение 2-х переменных не используя дополнительной.
Я сделал только для типа int, теперь хотел бы узнать, каким образом можно сделать для любых типов.
Хоть это число, строка или даже объект.
В качестве ответа на вопрос из собеседования это окей. Для чисел есть ещё вариант со сложением и вычитанием, например. Для любых типов, боюсь, так просто не получится.
В принципе можно написать функцию, которая будет трактовать любой объект как последовательность байтиков определённой длины и обменивать местами байтики. Но это работает только для так называемых POD-типов — фактически, структурок Си. Объекты Си++ могут иметь определённые свойства, которые они возможно хотели бы сохранить, поэтому их нельзя просто так перемещать в памяти. Для этого нужен некоторый контракт. Вы можете или сами потребовать у объектов определять метод swap(), или же воспользоваться контрактами языка: конструкторами копирования, перемещения, операторами присваивания и т. п.

Сообщение от
Kastaneda
Я своими глазами видел, как компилятор из кода сделал одну (!!!) ассемблерную инструкцию, которая меняет местами значения своих аргументов. Т.е. компилятор понял, что происходит в этом коде и предложил свой лучший вариант (даже лучше ксоров).
А если обе переменные в момет обмена находятся в регистрах, то инструкций не надо вообще: просто дальше считаем, что переменная A в регистре, в котором была переменная B, и наоборот.