Beim Durchlaufen einiger Qt-Codes stieß ich auf Folgendes. Die Funktion QMainWindowLayout::invalidate()
hat die folgende Umsetzung:Warum sollte ein Compiler diese Assembly generieren?
void QMainWindowLayout::invalidate()
{
QLayout::invalidate()
minSize = szHint = QSize();
}
Es wird dazu zusammengestellt:
<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
Die Montage von invalidate + 9 zu entkräften + 36 dumm scheint. Zuerst schreibt der Code -1 in% rbx + 0x564 und% rbx + 0x568, aber dann lädt er diese -1 von% rbx + 0x564 zurück in ein Register, nur um es in% rbx + 0x56c zu schreiben. Dies scheint etwas zu sein, was der Compiler leicht in der Lage sein sollte, sofort in einen anderen Schritt zu optimieren.
Also ist dieser dumme Code (und wenn ja, warum würde der Compiler es nicht optimieren?) Oder ist das irgendwie sehr clever und schneller als nur einen weiteren Zug sofort zu verwenden?
(Anmerkung:.. Dieser Code ist von der normalen Release-Bibliothek Build von ubuntu ausgeliefert, so wurde es vermutlich von GCC in optimize Modus kompiliert Die minSize
und szHint
Variablen sind normale Variablen vom Typ QSize
)
QT ist eine Benutzeroberfläche, richtig? Wie oft hintereinander müssten Sie ein Fenster ungültig machen? Wie performant müsste das eigentlich sein? Die Art von Mikro-Optimierung, die Sie beschreiben, ist fast sicher nicht die Mühe wert für den minimalen Nutzen, der entstehen würde. –
Es scheint in der Tat suboptimal zu sein, vielleicht hat der Gucklochoptimierer das nicht bekommen. –
@RobertHarvey Aber das ist nicht der Punkt hier - OP versucht nicht zu optimieren, er versucht den Grund zu verstehen. –