在单步执行一些 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 的程序集似乎很愚蠢。首先,代码将 -1 写入 %rbx+0x564 和 %rbx+0x568,然后将 -1 从 %rbx+0x564 加载回寄存器,只是为了将其写入 %rbx+0x56c。这似乎是编译器应该能够轻松地优化为立即的另一个动作。
那么这个愚蠢的代码(如果是这样,为什么编译器不优化它?)或者这是否比立即使用另一个动作更聪明和更快?
(注:此代码来自 ubuntu 提供的正常发布库构建,因此推测它是由 GCC 在优化模式下编译的。minSize
和szHint
变量是类型的普通变量QSize
。)