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)) Интересно, кроме тех кто встроенные системы на самых "древних" микроконтроллерах ваяет, часто такие траблы и необходимости появляются? ![]() Стоит овчинка выделки без особой на то причины?... |
Автор: | Galkov [ Вторник, 08 Июнь, 2010 01:26 ] |
Заголовок сообщения: | Re: Как обменяться указателями без создания доп. переменной? |
Wlad2 писал(а): Стоит овчинка выделки без особой на то причины? Если для Вас эффективность конечного продукта не является показателем назначения - НЕ СТОИТ.Возможен вариант: у Вас есть компилятор, который делает подобные оптимизации сам, и лучше Вас. В общем - выбирайте ![]() Wlad2 писал(а): кроме тех кто встроенные системы на самых "древних" микроконтроллерах ваяет Позволю себа Вам напомнить, что у "ваяющих" показателями назначения также являются надежность, и цена.Можете себе представить, оказывается: надо не только не делать ошибок в программе, но и еще кое-чего... Кстати о надежности... Октогоны имеют наработку на отказ порядка 10 лет. Что в переводе на интенсивность отказов ~1e-5/час С точки зрения электронной комплектации... ну скажем мягко - барахло. Мне больше нравится ~1e-7/час при цене 50 рублей за камень... Несмотря на мнение очень продвинутой молодежи про "древность" ![]() |
Автор: | Wlad [ Вторник, 08 Июнь, 2010 06:59 ] |
Заголовок сообщения: | Re: Как обменяться указателями без создания доп. переменной? |
Galkov писал(а): Wlad2 писал(а): Стоит овчинка выделки без особой на то причины? Если ... эффективность ... не является показателем назначенияБуквы все узнал. Даже в слова сложились. Но смысл - так и не поймался... Уж - звыняйте... |
Автор: | Иван Денисов [ Вторник, 08 Июнь, 2010 07:36 ] |
Заголовок сообщения: | Re: Как обменяться указателями без создания доп. переменной? |
Смысл, в том, что если эта операция применяется не очень часто, и не предъявляются требования к максимальной оптимизации кода и методов, в ущерб читаемости и потраченного времени, то не стоит с этим XOR возится. Например программа работает час, а использование метода убыстрит выполнение на несколько секунд, то "овчинка выделки не стоит". Если в два раза, то можно написать, процедуру битовых операций над указателями и применять, но необходимости в этом действительно нет. |
Автор: | Geniepro [ Вторник, 08 Июнь, 2010 09:12 ] |
Заголовок сообщения: | Re: Как обменяться указателями без создания доп. переменной? |
Wlad2 писал(а): Интересно, кроме тех кто встроенные системы на самых "древних" микроконтроллерах ваяет, часто такие траблы и необходимости появляются? ![]() Стоит овчинка выделки без особой на то причины?... Когда я делал программы для микроконтроллеров, даже тогда у меня не было нужды в таком конкретно трюке, который здесь упоминался. Видел как-то в коде сотрудника, но так и не смог понять, что же он там реально выиграл? По-моему, он только зря код обфусцировал... Хотя пришлось как-то выделять один обработчик прерывания в отдельную ассемблерную процедуру, так как сгенерированный сишным компилятором вариант оказался на один машинный цикл (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 писал(а): А там, где это критично, всё равно на ассемблере писать будете, указывая расположение каждого байта в памяти... Существуют более прозаичные причины: просто НЕ В ЛОМ ![]() Посмотрите на 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 ... Все относительно... ![]() Ну и ясный перец, цитата из вики - вовсе не для мастеров ЯВУ предназначена ЗЫ. и это я вовсе не фантазию привел, а могу просто показать как полный АСМ-код, так и Дельфи исходник. Барон Мюнхаузен славен не тем, что летал, или не летал... А тем, что не врет!!! ![]() |
Автор: | Galkov [ Среда, 09 Июнь, 2010 13:49 ] |
Заголовок сообщения: | Re: Как обменяться указателями без создания доп. переменной? |
Wlad2 писал(а): Но смысл - так и не поймался... Неужели комбинации слов незнакомые ![]() Уж не "показаль назначения" ли ![]() |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |