OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 24 Апрель, 2024 15:51

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Вторник, 11 Май, 2010 10:43 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3776
Подскажите, пожалуйста, как обменяться указателями без создания временной переменной?

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

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


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 11 Май, 2010 10:54 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
http://en.wikipedia.org/wiki/XOR_swap_algorithm
но зачем... не будет-ли бОльшим уродством? :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 11 Май, 2010 18:42 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
divan писал(а):
Подскажите, пожалуйста, как обменяться указателями без создания временной переменной?

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

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


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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 11 Май, 2010 20:24 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3776
XOR и правда непонятнее будет в тексте программы.
Согласен, и благодарю за ответы. Так и буду дальше менять, как менял.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 11 Май, 2010 20:43 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
divan писал(а):
XOR и правда непонятнее будет в тексте программы.
Согласен, и благодарю за ответы. Так и буду дальше менять, как менял.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 11 Май, 2010 22:34 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Если бы в языке было векторное присваивание, то могло бы выглядеть так:

a, b := b, a;

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 12 Май, 2010 06:08 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Илья Ермаков писал(а):
Если бы в языке было векторное присваивание, то могло бы выглядеть так:

a, b := b, a;

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

Учтем!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 07 Июнь, 2010 21:38 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
Ярослав Романченко писал(а):
но зачем... не будет-ли бОльшим уродством? :)

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 07 Июнь, 2010 22:54 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Galkov писал(а):
Ярослав Романченко писал(а):
но зачем... не будет-ли бОльшим уродством? :)

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 08 Июнь, 2010 01:26 

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 08 Июнь, 2010 06:59 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 08 Июнь, 2010 07:36 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3776
Смысл, в том, что если эта операция применяется не очень часто, и не предъявляются требования к максимальной оптимизации кода и методов, в ущерб читаемости и потраченного времени, то не стоит с этим XOR возится.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 08 Июнь, 2010 09:12 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Wlad2 писал(а):
Интересно, кроме тех кто встроенные системы на самых "древних" микроконтроллерах ваяет, часто такие траблы и необходимости появляются? :twisted:
Стоит овчинка выделки без особой на то причины?...

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 08 Июнь, 2010 14:10 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Geniepro писал(а):
То ли дело в Питоне или CLU: a, b = b, a
Это же просто форма записи (а не решение), которая делает накладные расходы неявными, но при этом не устраняет их.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 08 Июнь, 2010 14:41 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
igor писал(а):
Geniepro писал(а):
То ли дело в Питоне или CLU: a, b = b, a
Это же просто форма записи (а не решение), которая делает накладные расходы неявными, но при этом не устраняет их.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 09 Июнь, 2010 08:49 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 09 Июнь, 2010 12:36 

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 09 Июнь, 2010 12:42 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Обсуждение началось как вопрос: Является ли уродством такой код:
Код:
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;
-- ещё большее уродство.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 09 Июнь, 2010 13:39 

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 09 Июнь, 2010 13:49 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
Wlad2 писал(а):
Но смысл - так и не поймался...
Неужели комбинации слов незнакомые :wink:
Уж не "показаль назначения" ли :?:


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB