У меня есть 2 структуры
out и
pos которые хранят несколько байтов. Где то в коде хочу установить данные в out структуре:
CODE
out.shadowX1 = pos.X1; /* shadow register X1 */
out.shadowY1 = pos.Y1; /* shadow register Y1 */
out.shadowX2 = pos.X2; /* shadow register X2 */
out.shadowY2 = pos.Y2; /* shadow register Y2 */
out.shadowX1 = pos.X1; /* shadow register X1 */
Адреса всех элементов известны в момент компиляции так что я ожидал каждое присвоение потребляет 2 команды. С удивлением нашел такой код:
CODE
0000B8 8160 LD R22,Z
0000BA 936C ST X,R22
out.shadowY1 = pos.Y1; /* shadow register Y1 */
0000BC 8161 LDD R22,Z+1
0000BE EAA1 LDI R26,0xA1
0000C0 E0B1 LDI R27,0x01
0000C2 936C ST X,R22
out.shadowX2 = pos.X2; /* shadow register X2 */
0000C4 8162 LDD R22,Z+2
0000C6 EAA2 LDI R26,0xA2
0000C8 E0B1 LDI R27,0x01
0000CA 936C ST X,R22
out.shadowY2 = pos.Y2; /* shadow register Y2 */
0000CC 8163 LDD R22,Z+3
0000CE EAA3 LDI R26,0xA3
0000D0 E0B1 LDI R27,0x01
0000D2 936C ST X,R22
Я знаю что структуры "любят" работать с индекс регистры, но здесь нет никакой логики (оптимизация кода на макс по скорости).
Попробовал поставить:
CODE
*(uint8_t *)(&out.shadowX1) = *(uint8_t *)(&pos.X1);
но результат тот же.
Как можно вразумить компилера не делать такие дурные вещи?
Сообщение отредактировал Student2 - Aug 12 2009, 12:09