Код: Выделить всё
void custom_delay(unsigned int delay) {
while(--delay) __NOP();
}
Уже второй пример и в обоих есть причина по которой не выкинута функция. Но в один прекрасный момент этой причины не окажется.
Код: Выделить всё
void custom_delay(unsigned int delay) {
while(--delay) __NOP();
}
Код: Выделить всё
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
Да хватит вам спорить, посмотрите лучше статьи про барьеры компилятора и памяти, а то вам будет непонятно что, например, внутри критической секции происходит и почему там volatile не нужен. И не забудьте, что компилятор может, а не обязан выкинуть/оптимизировать такой код. Что касается _NOP(), то вот 100% внутри описания этой функции/макроса есть указание на запрет выбрасывания ассемблерного кода, типа volatile asm {nop}. Или же ваш компилятор любую конструкцию asm понимает с запретом на оптимизацию.Не сочиняйте. Волатилы там нет.
Если функция одна и ваша, то, возможно. Если их много и они из библиотеки, то получится гора писанины, не дающая никаких плюсов.Собственно, возвращаемая ф-ия delay, тоже немного подуменьшит кол-во напечатанных символов кода, не изменяя итоговый результат исполнения программы.
А если функция будет не в if ее разве не выкинет?VladislavS писал(а):Убери volatile и выкинет потому что ничего не возвращает.
Если компилятор не соответствует стандарту и ведет себя не предсказуемо - втопку его.VladislavS писал(а):похоже вы не видели результаты работы по настоящему злобных оптимизирующих компиляторов.
Обоснуете?По мне, так то, что Вы написали, считается дурным тоном.
Сильно уж читателе-зависимый критерий. У иных кровь захлещет от любого мало-мальски профессионального представления.Кровь из глаз пойдёт у читателя этого кода
Нет конечно. Ибо - леньa5021 писал(а):Возьметесь оспаривать?
Запросто. Написание любого плохочитаемого кода априори является дурным тоном. По крайней мере, для меня. Возможно, для Вас это нормаa5021 писал(а):Обоснуете?
пишите так, и люди будут плевать вам вслед.a5021 писал(а):Еще одна забавная штука попалась на глаза: код, который нарушает все правила, но тем не менее работает.
тем не менее, не работает: https://ideone.com/557ULM GCC 6.3a5021 писал(а):но тем не менее работает. Это GCC 5.4.1
Код: Выделить всё
if (reset() && (delay(100), 1) && init() && (delay(100), 1) && run_cmd(MOVE_FORWARD)) {
// do smth
}Код: Выделить всё
if (! reset())
return;
delay(100);
if (! init())
return;
delay(100);
if (! run_cmd(MOVE_FORWARD))
return;
// do smth
Чтобы вам было легче прийти к такому примитивному выводу, я вам даже версию компайлера специально указал.код, эксплуатирующий багофичи отдельных версий компилятора - разве можно придумать что-то более ужасное?