Ни один компилятор не смог нормально соптимизировать простые очевидные вещи..
Код
class tormoz{
public:
void remove();
private:
tormoz *next;
tormoz *prev;
};
void tormoz::remove(){
next->prev=prev;
prev->next=next;
}
rvct -O3 -OtimeКод
00000134 <_ZN6tormoz6removeEv>:
134: e9d0 1200 ldrd r1, r2, [r0]
138: 604a str r2, [r1, #4]
13a: e9d0 1000 ldrd r1, r0, [r0] ;<<<---- Зачем??
13e: 6001 str r1, [r0, #0]
140: 4770 bx lr
gcc-4.7.1 -O3 -OtimeКод
00000000 <_ZN6tormoz6removeEv>:
0: 6803 ldr r3, [r0, #0]
2: 6842 ldr r2, [r0, #4]
4: 605a str r2, [r3, #4]
6: 6842 ldr r2, [r0, #4] ;<<<---- Зачем??
8: 6013 str r3, [r2, #0]
a: 4770 bx lr
Вот так оптимизирует нормально на обеих компиляторах, но это ж не те уже времена, когда использовали ключевое слово
register и вучную оптимизировали порядок загрузки..
Код
void tormoz::remove(){
tormoz *n=next,*p=prev;
n->prev=p;
p->next=n;
}
0: e890 000c ldmia.w r0, {r2, r3}
4: 6053 str r3, [r2, #4]
6: 601a str r2, [r3, #0]
8: 4770 bx lr