Mentre si passava attraverso un codice Qt, mi sono imbattuto in quanto segue. La funzione QMainWindowLayout::invalidate()
ha la seguente implementazione:Perché un compilatore genera questo assieme?
void QMainWindowLayout::invalidate()
{
QLayout::invalidate()
minSize = szHint = QSize();
}
Viene compilato in questo:
<invalidate()> push %rbx
<invalidate()+1> mov %rdi,%rbx
<invalidate()+4> callq 0x7ffff4fd9090 <QLayout::invalidate()>
<invalidate()+9> movl $0xffffffff,0x564(%rbx)
<invalidate()+19> movl $0xffffffff,0x568(%rbx)
<invalidate()+29> mov 0x564(%rbx),%rax
<invalidate()+36> mov %rax,0x56c(%rbx)
<invalidate()+43> pop %rbx
<invalidate()+44> retq
Complesso da invalidi + 9 + 36 per invalidare sembra stupido. Innanzitutto il codice scrive da -1 a% rbx + 0x564 e% rbx + 0x568, ma poi carica quello -1 da% rbx + 0x564 in un registro solo per scriverlo su% rbx + 0x56c. Questo sembra qualcosa che il compilatore dovrebbe facilmente essere in grado di ottimizzare in un'altra mossa immediata.
Quindi è questo codice stupido (e se sì, perché il compilatore non dovrebbe ottimizzarlo?) O è in qualche modo molto intelligente e veloce rispetto all'utilizzo di un'altra mossa immediata?
(Nota:.. Questo codice è dal normale accumulo biblioteca rilascio spedito da ubuntu, così è stato presumibilmente compilata da GCC in modalità ottimizzare la minSize
e szHint
variabili sono normali variabili di tipo QSize
)
QT è un'interfaccia utente, corretta? Quante volte in successione avresti bisogno di invalidare una finestra? Quanto dovrebbe essere effettivamente performante? Il tipo di micro-ottimizzazione che stai descrivendo non merita quasi certamente lo sforzo per il minimo beneficio che ne deriverebbe. –
Sembra davvero non ottimale, forse l'ottimizzatore dello spioncino non l'ha capito. –
@RobertHarvey Ma non è questo il punto qui: l'OP non sta cercando di ottimizzare, sta cercando di capirne il motivo. –