ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
10 февраля
1569835 Топик полностью
il-2 (Сегодня, 16:05, просмотров: 191)
Всегда считал, что пре-инкремент более эффективен чем пост-инкремент. Речь разумеется про то, что результат такой операции тут-же используется например в цикле или в сравнении. Но оказывается есть нюансы. 

Например конструкция:

if ( ++cnt > 50 )

Если cnt - байтовая переменная, а архитекрура МК - 32битная, то компилятор после инкремента перед сравнением ставит инструкцию обрезания до байта.

А для конструкции

if ( cnt++ >= 50 )

Лишней инструкции по обрезанию байта не будет. Вот как это выглядит в RISC-V:


if ( ++rly_tpre_1s >= 51 )

6c96: a5a1c783 lbu a5,-1446(gp) # 20002cde <rly_tpre_1s>

6c9a: 0785 addi a5,a5,1

6c9c: 0ff7f793 zext.b a5,a5 ----------Вот она, зараза!!!!!!

6ca0: a4f18d23 sb a5,-1446(gp) # 20002cde <rly_tpre_1s>

6ca4: 03200713 li a4,50

6ca8: 0af77163 bgeu a4,a5,6d4a <BSP_RLY_20ms_TimerCB+0xd4>


if ( rly_tpre_1s++ >= 51 )

6c96: a5a1c783 lbu a5,-1446(gp) # 20002cde <rly_tpre_1s>

6c9a: 00178713 addi a4,a5,1

6c9e: a4e18d23 sb a4,-1446(gp) # 20002cde <rly_tpre_1s>

6ca2: 03200713 li a4,50

6ca6: 0af77163 bgeu a4,a5,6d48 <BSP_RLY_20ms_TimerCB+0xd2>

Хитрость в том, что при пост-инкременте результат помещается в другой регистр (а4), а для сравнения используется исходное значение (а5), которое не нужно обрезать.