Что-то мне подсказывает что даже mov'ов здесь больше будет чем с 'c', не говоря уже про сложение с вычитанием =) Мне больше нравятся аппаратные функции swap.
Тільки для програмування це не вигідне за часом, програш пам'яті на одну змінну значно менший за програш за часом.
Із зайвою змінною виконується 3 дії, а без неї - аж 6, тобто вдвічі більше.
Та й ідея не нова.
Тому незалік. Чекаємо наступних рішень! ;)
Извините, постараюсь избегать далее. На такую реакцию я и ожидал. Просто это сложновато. :)
Тепер перевод сказанного.
Только для программирования это невыгодно по времени, поригрыш памяти на одну переменную значительно меньший проигрыша по времени.
С лишней переменной выполняется 3 действия, а без нее - целых 6, т.е. в два раза больше.
Да и идея не нова.
Поэтому незачет. Ждем следующих решений!
ПС. Решение с xor уже лучше, но оно вылетает в некоторых случаях, сейчвас, правда, не помню, в каких...
Сколько байт занимает переменная каждого типа, думаю, вы и так знаете.
А оценка хотя бы по отношению: времени в два раза меньше, а памяти больше только в полтора. :)
ПС. Я занимаюсь олимпиадным программированием, поэтому экономия времени важнее. В других сферах, возможно, по-другому.
Оценивать можно лишь относительно задачи и оборудования. Если операция делается за 10 миллисекунд, а можно делать и за 200, но при этом памяти мало будешь оптимизировать в эту сторону. Ну и наоборот.
А в олимпиадах еще экономия времени написания важна, да и там PC, вряд ли память так критична.
Вполне удалась, мне кажется. Абсолютно точно показало что неуважение (в виде заведомо неудобочитаемого для большинства аудитории текста) влечет за собой негатив.
На уровне ассемблера вы все равно ничего не выигрываете, скорее наоборот. Для того, чтобы произвести указанную операцию, требуется минимум один свободный регистр и три операции: add, sub, sub, ну и ещё сколько-то mov.
Если же писать с третьей переменной, то вполне можно ожидать, что компилятор заметит, что третья переменная не используется больше нигде и вынесет её в регистр, а саму операцию заменит на xchg. Итого получится: загрузили одну переменную в регистр, xchg с другой переменной, записали регистр в переменную.
Так что если брать описанный способ, то он заведомо в проигрыше, так как его вряд ли оптимизируешь при недостатке памяти (а значит, и недостатке свободных регистров). Хотя несомненно, сам по себе очень интересен, и заставил задуматься и убедиться что действительно работает.
PS. Только что проверил (GCC 4.1.2). Способ с тремя переменными GCC компилирует как 4 mov используя 2 регистра, под третью переменную память не выделяется.
Описанный в статье способ: add, sub, sub, 6 штук mov. Используется 4 регистра, правда недостатка в регистрах нет.
Поменять a и b без c