いくつかのQtコードをステップ実行しているうちに、私は次のことを見つけました。コンパイラがこのアセンブリを生成するのはなぜですか?
void QMainWindowLayout::invalidate()
{
QLayout::invalidate()
minSize = szHint = QSize();
}
それはこれにコンパイルされています:無効+ 9から
<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
アセンブリ+ 36は愚かなようで無効化する機能QMainWindowLayout::invalidate()
は、次の実装があります。最初にコードは%rbx + 0x564と%rbx + 0x568に-1を書き込みますが、それを%rbx + 0x564から-1を%rbx + 0x56cに書き出すためのレジスタに戻します。これは、コンパイラがすぐに別の動きに簡単に最適化できるようなもののようです。
これは愚かなコードです(もしそうなら、コンパイラはそれを最適化しないのですか?)これはどういうわけか、非常に巧妙で高速です。
(注:このコードは、Ubuntuので出荷され、通常のリリースライブラリビルドからなので、それはおそらく最適化モードでGCCでコンパイルされたminSize
とszHint
変数はタイプQSize
の通常の変数です)
QTは正しいUIですか?連続してウィンドウを無効にする必要が何回ですか?どのようにパフォーマンスが実際に必要なのだろうか?あなたが記述しているマイクロ最適化の種類は、発生する可能性のある最小限の利益のための努力に値するものではありません。 –
それは実際には最適ではないようですが、覗きょうのオプティマイザがこれを取得していない可能性があります。 –
@RobertHarveyしかし、それはここのポイントではない - OPは最適化しようとしていない、彼は理由を理解しようとしている。 –