Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="a5021",url="/forum/viewtopic.php?p=3483448#p3483448"]Теоретик из вас, походу, никудышный.

Код: Выделить всё

  
void custom_delay(unsigned int delay) {
  while(--delay) __NOP();
}
[/uquote]Потому что NOP это "полезное действие" или volatile.

Уже второй пример и в обоих есть причина по которой не выкинута функция. Но в один прекрасный момент этой причины не окажется.
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3483455#p3483455"]Потому что NOP это "полезное действие" или volatile.[/uquote]
Не сочиняйте. Волатилы там нет.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

VladislavS, насколько помню вы писали что оптимизатор выкинет delay из if потому что она ничего не возвращает. https://radiokot.ru/forum/viewtopic.php ... 2#p3483222
Про volatile ни слова не было.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Лень включать комп, но продравшись через заголовочные файлы ты доберёшься до ассемблерной команды NOP, которую компилятор не имеет права выкинуть.

Добавлено after 5 minutes 32 seconds:
[uquote="Мурик",url="/forum/viewtopic.php?p=3483458#p3483458"]Про volatile ни слова не было.[/uquote]Убери volatile и выкинет потому что ничего не возвращает. Представь, если она будет скомпилирована в другом модуле. Что будет в случаях когда она возвращает значениеи или не возвращает?
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Ноп есть. Волатилы, в том числе в заголовочных файлах, нет.

Код: Выделить всё

     65          void custom_delay(unsigned int delay) {
   \                     custom_delay: (+1)
   \        0x0   0xE000             B        ??custom_delay_0
     66            while(--delay) __NOP();
   \                     ??custom_delay_1: (+1)
   \        0x2   0xBF00             Nop      
   \                     ??custom_delay_0: (+1)
   \        0x4   0x1E40             SUBS     R0,R0,#+1
   \        0x6   0xD1FC             BNE      ??custom_delay_1
     67          }
   \        0x8   0x4770             BX       LR               ;; return
Но я почему-то ничего не слышал о волшебных свойствах этой команды, запрещающих всякую оптимизацию. Кроме того, еще недавно вы категорично утверждали, что от оптимизации внутри if-а ничего не может спасти.
Реклама
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

[uquote="a5021",url="/forum/viewtopic.php?p=3483448#p3483448"]И что это даст кроме ощущения преемственности поколений?[/uquote]Т.е. избавление от кучи фигурных скобок с вложенными if'ами Вам что-то дало, а избавление от скобок, запятых, 1-диничек, ... Вам ничего, кроме ощущения преемственности поколений, не даёт ?
Вы боролись с оптимизацией строк кода. Собственно, возвращаемая ф-ия delay, тоже немного подуменьшит кол-во напечатанных символов кода, не изменяя итоговый результат исполнения программы.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

Не сочиняйте. Волатилы там нет.
Да хватит вам спорить, посмотрите лучше статьи про барьеры компилятора и памяти, а то вам будет непонятно что, например, внутри критической секции происходит и почему там volatile не нужен. И не забудьте, что компилятор может, а не обязан выкинуть/оптимизировать такой код. Что касается _NOP(), то вот 100% внутри описания этой функции/макроса есть указание на запрет выбрасывания ассемблерного кода, типа volatile asm {nop}. Или же ваш компилятор любую конструкцию asm понимает с запретом на оптимизацию.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="a5021",url="/forum/viewtopic.php?p=3483477#p3483477"]Но я почему-то ничего не слышал о волшебных свойствах этой команды, запрещающих всякую оптимизацию.[/uquote]Не конкретно этой команды, а любых ассемблерных вставок, коих вы как пользователь iar в интринсиках можете найти достаточно много.

[uquote="a5021",url="/forum/viewtopic.php?p=3483477#p3483477"]Кроме того, еще недавно вы категорично утверждали, что от оптимизации внутри if-а ничего не может спасти.[/uquote]Если не применить специальных мер, да оптимизирует. В двух примерах эти меры были применены.

Господа, программируйте как хотите, но тут заложена потенциальная проблема. Умеете обходить, хорошо, но вспомните сколько тем "не заходит в ветку под отладкой" и им подобных от нубов. Лучше такое не пропагандировать.
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Заходит он в отладку в таких выражениях. По каждому условию заходит. Придумайте что-то по-убедительнее.

[uquote="VladislavS",url="/forum/viewtopic.php?p=3483490#p3483490"]Лучше такое не пропагандировать.[/uquote]
Лучше категоричные заявления от фонаря пропагандировать по вашим рецептам?

[uquote="Аlex",url="/forum/viewtopic.php?p=3483480#p3483480"]Вы боролись с оптимизацией строк кода.[/uquote]
С глубокой вложенностью я боролся. Оная вложенность заслуженно считается плохим тоном. Я же предельно конкретно об этом написал. Что за выдумки тут возникают?
Собственно, возвращаемая ф-ия delay, тоже немного подуменьшит кол-во напечатанных символов кода, не изменяя итоговый результат исполнения программы.
Если функция одна и ваша, то, возможно. Если их много и они из библиотеки, то получится гора писанины, не дающая никаких плюсов.
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

VladislavS писал(а):Убери volatile и выкинет потому что ничего не возвращает.
А если функция будет не в if ее разве не выкинет?
Не нужно пытаться оправдать себя. Просто признай ошибку.
Во первых, утверждаешь что нет последовательности вычисления в if, а это не так. Выполнение идет слева на право.
Во вторых утверждаешь что из if будет выброшена функция delay потому что ничего не возвращает и сравнивать нечего, но это не так и было доказано на практике.
Прочитай книжки по Си хотя бы для чайников, чтобы освежить знания.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Мурик, похоже вы не видели результаты работы по настоящему злобных оптимизирующих компиляторов.
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Так покажите. Неопределенные движения рукой по направлению куда-то вдаль ничего не доказывают. Точнее доказывают, но не думаю, что вам это может нравиться.
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

[uquote="a5021",url="/forum/viewtopic.php?p=3483497#p3483497"]Оная вложенность заслуженно считается плохим тоном.[/uquote]Кем, Вами считается ? :)
По мне, так то, что Вы написали, считается дурным тоном. Кровь из глаз пойдёт у читателя этого кода :)))
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

VladislavS писал(а):похоже вы не видели результаты работы по настоящему злобных оптимизирующих компиляторов.
Если компилятор не соответствует стандарту и ведет себя не предсказуемо - втопку его.
Я использовал GCC в коде выше. Он для МК достаточно агрессивно оптимизирует, но ведет себя предсказуемо и если "сказать Фу", на код не кидается и не "выгрызает" его.
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="Аlex",url="/forum/viewtopic.php?p=3483562#p3483562"]Кем, Вами считается ? :)[/uquote]
Советую учебничек полистать какой-нибудь. Там обычно пишут что-то вроде: "Deeply nested conditionals make it just about impossible to tell what code will run, or when." Возьметесь оспаривать?
По мне, так то, что Вы написали, считается дурным тоном.
Обоснуете?
Кровь из глаз пойдёт у читателя этого кода
Сильно уж читателе-зависимый критерий. У иных кровь захлещет от любого мало-мальски профессионального представления.
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

a5021 писал(а):Возьметесь оспаривать?
Нет конечно. Ибо - лень :)
a5021 писал(а):Обоснуете?
Запросто. Написание любого плохочитаемого кода априори является дурным тоном. По крайней мере, для меня. Возможно, для Вас это норма :dont_know:
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="Аlex",url="/forum/viewtopic.php?p=3483597#p3483597"]Написание любого плохочитаемого кода априори является дурным тоном.[/uquote]
Согласен. Хуже может быть только голимый субъективизм и бездоказательность в утверждениях.

PS. Еще одна забавная штука попалась на глаза: код, который нарушает все правила, но тем не менее работает. Это GCC 5.4.1. x86, где новомодных замыканий просто не может быть в принципе, но они там таки есть. :)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

a5021 писал(а):Еще одна забавная штука попалась на глаза: код, который нарушает все правила, но тем не менее работает.
пишите так, и люди будут плевать вам вслед.

Добавлено after 3 minutes 33 seconds:
a5021 писал(а):но тем не менее работает. Это GCC 5.4.1
тем не менее, не работает: https://ideone.com/557ULM GCC 6.3
писать компиляторо-зависимый код, т.е. код, эксплуатирующий багофичи отдельных версий компилятора - разве можно придумать что-то более ужасное?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3483490#p3483490"]Господа, программируйте как хотите, но тут заложена потенциальная проблема. Умеете обходить, хорошо, но вспомните сколько тем "не заходит в ветку под отладкой" и им подобных от нубов. Лучше такое не пропагандировать.[/uquote]

Никакой проблемы нет. Не выдумывайте.
Как должен вести компилятор при

Код: Выделить всё

  if (reset() && (delay(100), 1) && init() && (delay(100), 1) && run_cmd(MOVE_FORWARD)) {
        // do smth
  }
четко определено. Нет никаких неоднозначностей. И совершенно не важно возвращает ли delay () значение или не возвращает. Если в этом случае компилатор "викинет" delay (), то руки надо отрывать автору delay (), данная конструкция здесь вообще не при чем.

ЗЫ. Я противник подобных конструкций лишь потому, что при просмотре кода приходится задерживаться на этих строках больше чем они заслуживают - не всегда с перврго раза понятно, зачем автор так извратился. Хотел от вложенных if-ов уйти? Так есть return Ж-)

Код: Выделить всё

if (! reset())
    return;
delay(100);
if (! init())
    return;
delay(100);
if (! run_cmd(MOVE_FORWARD))
    return;

// do smth
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="ARV",url="/forum/viewtopic.php?p=3483758#p3483758"]пишите так, и люди будут плевать вам вслед.[/uquote]
Плохо вам. Вы не улавливаете курьезности ситуации.
код, эксплуатирующий багофичи отдельных версий компилятора - разве можно придумать что-то более ужасное?
Чтобы вам было легче прийти к такому примитивному выводу, я вам даже версию компайлера специально указал.
Ответить

Вернуться в «Разные вопросы по МК»