いくつかのQtコードをステップ実行しているときに、次のことに遭遇しました。関数QMainWindowLayout::invalidate()
には次の実装があります。
void QMainWindowLayout::invalidate()
{
QLayout::invalidate()
minSize = szHint = QSize();
}
これは次のようにコンパイルされます。
<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
invalidate+9 から invalidate+36 へのアセンブリはばかげているようです。最初に、コードは %rbx+0x564 と %rbx+0x568 に -1 を書き込みますが、%rbx+0x564 からその -1 をレジスタにロードし直して、%rbx+0x56c に書き込みます。これは、コンパイラーがすぐに別の動きに簡単に最適化できるように思われます。
では、このばかげたコードは (もしそうなら、なぜコンパイラはそれを最適化しないのでしょうか?) それとも、これはどういうわけか非常に巧妙で、すぐに別の移動を使用するよりも高速なのでしょうか?
(注: このコードは、ubuntu によって出荷された通常のリリース ライブラリ ビルドからのものであるため、おそらく GCC によって最適化モードでコンパイルされたものです。minSize
およびszHint
変数は、タイプ の通常の変数ですQSize
。)