OberonCore
https://forum.oberoncore.ru/

Как обменяться указателями без создания доп. переменной?
https://forum.oberoncore.ru/viewtopic.php?f=35&t=2634
Страница 1 из 2

Автор:  Иван Денисов [ Вторник, 11 Май, 2010 10:43 ]
Заголовок сообщения:  Как обменяться указателями без создания доп. переменной?

Подскажите, пожалуйста, как обменяться указателями без создания временной переменной?

Сейчас приходится делать так
Код:
a, b, swicher: POINTER TO ARRAY OF ARRAY OF REAL;

swicher := a;
a := b;
b := swicher;


Согласитесь уродство?

Автор:  Ярослав Романченко [ Вторник, 11 Май, 2010 10:54 ]
Заголовок сообщения:  Re: Как обменяться указателями без создания доп. переменной?

http://en.wikipedia.org/wiki/XOR_swap_algorithm
но зачем... не будет-ли бОльшим уродством? :)

Автор:  Валерий Лаптев [ Вторник, 11 Май, 2010 18:42 ]
Заголовок сообщения:  Re: Как обменяться указателями без создания доп. переменной?

divan писал(а):
Подскажите, пожалуйста, как обменяться указателями без создания временной переменной?

Сейчас приходится делать так
Код:
a, b, swicher: POINTER TO ARRAY OF ARRAY OF REAL;

swicher := a;
a := b;
b := swicher;


Согласитесь уродство?

Не соглашусь. Нормальный код - ясный и понятный.
Который поймет всякий, который будет работать после вас...

Автор:  Иван Денисов [ Вторник, 11 Май, 2010 20:24 ]
Заголовок сообщения:  Re: Как обменяться указателями без создания доп. переменной?

XOR и правда непонятнее будет в тексте программы.
Согласен, и благодарю за ответы. Так и буду дальше менять, как менял.

Автор:  Wlad [ Вторник, 11 Май, 2010 20:43 ]
Заголовок сообщения:  Re: Как обменяться указателями без создания доп. переменной?

divan писал(а):
XOR и правда непонятнее будет в тексте программы.
Согласен, и благодарю за ответы. Так и буду дальше менять, как менял.

ещё нагляднее будет сравнить длины последовательностей ассемблерных команд, сгенерированных компилятором в разных случаях (с оптимизацией и без).

Автор:  Илья Ермаков [ Вторник, 11 Май, 2010 22:34 ]
Заголовок сообщения:  Re: Как обменяться указателями без создания доп. переменной?

Если бы в языке было векторное присваивание, то могло бы выглядеть так:

a, b := b, a;

(Если семантика оператора будет определена именно правильно, векторно, а не "недетерминированно")

Автор:  Валерий Лаптев [ Среда, 12 Май, 2010 06:08 ]
Заголовок сообщения:  Re: Как обменяться указателями без создания доп. переменной?

Илья Ермаков писал(а):
Если бы в языке было векторное присваивание, то могло бы выглядеть так:

a, b := b, a;

(Если семантика оператора будет определена именно правильно, векторно, а не "недетерминированно")

Учтем!

Автор:  Galkov [ Понедельник, 07 Июнь, 2010 21:38 ]
Заголовок сообщения:  Re: Как обменяться указателями без создания доп. переменной?

Ярослав Романченко писал(а):
но зачем... не будет-ли бОльшим уродством? :)

не будет.
Представьте себе, что ваши локальные - в регистрах... И больше свободных регистров - нетути (а всякие push/pop Вам в данной задаче - как серпом по .... ну Вы в курсе)

А уж побочный эффект от "бесплатной" проверки на нуль - мастера Дзена уж найдут как применить.
((оно же, правда, может быть и минусом - "царапается" не в тему, предположим, ZF))

Автор:  Wlad [ Понедельник, 07 Июнь, 2010 22:54 ]
Заголовок сообщения:  Re: Как обменяться указателями без создания доп. переменной?

Galkov писал(а):
Ярослав Романченко писал(а):
но зачем... не будет-ли бОльшим уродством? :)

не будет.
Представьте себе, что ваши локальные - в регистрах... И больше свободных регистров - нетути (а всякие push/pop Вам в данной задаче - как серпом по .... ну Вы в курсе)
А уж побочный эффект от "бесплатной" проверки на нуль - мастера Дзена уж найдут как применить.
((оно же, правда, может быть и минусом - "царапается" не в тему, предположим, ZF))

Интересно, кроме тех кто встроенные системы на самых "древних" микроконтроллерах ваяет, часто такие траблы и необходимости появляются? :twisted:
Стоит овчинка выделки без особой на то причины?...

Автор:  Galkov [ Вторник, 08 Июнь, 2010 01:26 ]
Заголовок сообщения:  Re: Как обменяться указателями без создания доп. переменной?

Wlad2 писал(а):
Стоит овчинка выделки без особой на то причины?
Если для Вас эффективность конечного продукта не является показателем назначения - НЕ СТОИТ.
Возможен вариант: у Вас есть компилятор, который делает подобные оптимизации сам, и лучше Вас.
В общем - выбирайте :wink:

Wlad2 писал(а):
кроме тех кто встроенные системы на самых "древних" микроконтроллерах ваяет
Позволю себа Вам напомнить, что у "ваяющих" показателями назначения также являются надежность, и цена.
Можете себе представить, оказывается: надо не только не делать ошибок в программе, но и еще кое-чего...

Кстати о надежности...
Октогоны имеют наработку на отказ порядка 10 лет. Что в переводе на интенсивность отказов ~1e-5/час
С точки зрения электронной комплектации... ну скажем мягко - барахло.
Мне больше нравится ~1e-7/час при цене 50 рублей за камень...
Несмотря на мнение очень продвинутой молодежи про "древность" :P

Автор:  Wlad [ Вторник, 08 Июнь, 2010 06:59 ]
Заголовок сообщения:  Re: Как обменяться указателями без создания доп. переменной?

Galkov писал(а):
Wlad2 писал(а):
Стоит овчинка выделки без особой на то причины?
Если ... эффективность ... не является показателем назначения
Читал. Долго думал.
Буквы все узнал. Даже в слова сложились. Но смысл - так и не поймался... Уж - звыняйте...

Автор:  Иван Денисов [ Вторник, 08 Июнь, 2010 07:36 ]
Заголовок сообщения:  Re: Как обменяться указателями без создания доп. переменной?

Смысл, в том, что если эта операция применяется не очень часто, и не предъявляются требования к максимальной оптимизации кода и методов, в ущерб читаемости и потраченного времени, то не стоит с этим XOR возится.

Например программа работает час, а использование метода убыстрит выполнение на несколько секунд, то "овчинка выделки не стоит". Если в два раза, то можно написать, процедуру битовых операций над указателями и применять, но необходимости в этом действительно нет.

Автор:  Geniepro [ Вторник, 08 Июнь, 2010 09:12 ]
Заголовок сообщения:  Re: Как обменяться указателями без создания доп. переменной?

Wlad2 писал(а):
Интересно, кроме тех кто встроенные системы на самых "древних" микроконтроллерах ваяет, часто такие траблы и необходимости появляются? :twisted:
Стоит овчинка выделки без особой на то причины?...

Когда я делал программы для микроконтроллеров, даже тогда у меня не было нужды в таком конкретно трюке, который здесь упоминался. Видел как-то в коде сотрудника, но так и не смог понять, что же он там реально выиграл? По-моему, он только зря код обфусцировал...

Хотя пришлось как-то выделять один обработчик прерывания в отдельную ассемблерную процедуру, так как сгенерированный сишным компилятором вариант оказался на один машинный цикл (0.5 мкс) медленнее, чем ручной вариант -- не успевала программа отреагировать из-за этого.
Ещё, помнится, какие-то трюки с указателями на элементы структур делал, правда, уже не помню, что именно.
А вот обмен двух переменных с помощью операций вычитания или xor -- никогда нужды не было...
То ли дело в Питоне или CLU: a, b = b, a

Автор:  igor [ Вторник, 08 Июнь, 2010 14:10 ]
Заголовок сообщения:  Re: Как обменяться указателями без создания доп. переменной?

Geniepro писал(а):
То ли дело в Питоне или CLU: a, b = b, a
Это же просто форма записи (а не решение), которая делает накладные расходы неявными, но при этом не устраняет их.

Автор:  Geniepro [ Вторник, 08 Июнь, 2010 14:41 ]
Заголовок сообщения:  Re: Как обменяться указателями без создания доп. переменной?

igor писал(а):
Geniepro писал(а):
То ли дело в Питоне или CLU: a, b = b, a
Это же просто форма записи (а не решение), которая делает накладные расходы неявными, но при этом не устраняет их.

Ну Вам ли не всё равно? На практике эти накладные расходы в 99.999% случаев не критичны, а значит важнее наглядность изложения мысли.
А там, где это критично, всё равно на ассемблере писать будете, указывая расположение каждого байта в памяти...

Автор:  igor [ Среда, 09 Июнь, 2010 08:49 ]
Заголовок сообщения:  Re: Как обменяться указателями без создания доп. переменной?

Geniepro писал(а):
Ну Вам ли не всё равно?
Мне всё-равно. Только обсуждение велось о том как повысить эффективность (в плане быстродействия), а не о том как скрыть накладные расходы, не изменив при этом эффективность.

Автор:  Galkov [ Среда, 09 Июнь, 2010 12:36 ]
Заголовок сообщения:  Re: Как обменяться указателями без создания доп. переменной?

Geniepro писал(а):
А там, где это критично, всё равно на ассемблере писать будете, указывая расположение каждого байта в памяти...
Существуют более прозаичные причины: просто НЕ В ЛОМ :D
Посмотрите на KOL от Кладова - там большая половина имеет АСМ-версию.
Почему бы и нет, если оно уже устаканилось...
Почему да: дык почти любой компилятор - просто лох и недоучка, по сравнению с человеком (кстати, вот Вам и материал для экспериментального сравнения - до какой степени "лох и недоучка"). Было бы иначе, был бы и другой разговор. Наверное.

ЗЫ: Кстати, о "даже там у меня не возникало" - где-то там (KOL) у меня и возникала потребность "хитрого MOV-а": надо было безвозмездно (т.е. - даром) сравнить "че было", с тем "че будет", да и на нуль проверить это "че будет". И была реализована парой-тройкой команд проца. Без проблем, как бы...
Ну да, с пониманием проблемы были (дзен - он и в Африке дзен)... Даже Кладов спрашивал что-то типа "а это че за фигня"

Автор:  Geniepro [ Среда, 09 Июнь, 2010 12:42 ]
Заголовок сообщения:  Re: Как обменяться указателями без создания доп. переменной?

Обсуждение началось как вопрос: Является ли уродством такой код:
Код:
tmp := x;
x := y;
y := tmp;
По сравнению с таким кодом:
Код:
x, y := y, x;
Да, явное уродство.
Но вот такой код:
Код:
y := x XOR y;
x := y XOR x;
y := x XOR y;

или

x = x + y;
y = x - y;
x = x - y;
-- ещё большее уродство.

Автор:  Galkov [ Среда, 09 Июнь, 2010 13:39 ]
Заголовок сообщения:  Re: Как обменяться указателями без создания доп. переменной?

А такой код:
Код:
...
  SUB eax,[esp+28]
  JZ @@0 ;одна условная ветка
  ADD [esp+28],eax
  JZ @@1 ;вторая условная ветка
  ......
  POPAD
  RET
...
Вполне себе изящен. Хотя бы тем, что ни один компилятор такого не сочинит
Все относительно... :)
Ну и ясный перец, цитата из вики - вовсе не для мастеров ЯВУ предназначена

ЗЫ. и это я вовсе не фантазию привел, а могу просто показать как полный АСМ-код, так и Дельфи исходник.
Барон Мюнхаузен славен не тем, что летал, или не летал... А тем, что не врет!!! :D

Автор:  Galkov [ Среда, 09 Июнь, 2010 13:49 ]
Заголовок сообщения:  Re: Как обменяться указателями без создания доп. переменной?

Wlad2 писал(а):
Но смысл - так и не поймался...
Неужели комбинации слов незнакомые :wink:
Уж не "показаль назначения" ли :?:

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/