在逐步执行一些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
类型的常规变量。) 最佳答案
说傻话时不确定自己是对的。我认为编译器可能正在尝试在此处优化代码大小。内存mov指令没有64位立即数。因此,编译器必须像上面一样生成2条mov指令。他们每个将是10个字节,生成的2个移动是14个字节。它已被写入,因此很可能没有内存延迟,因此我认为您不会在此处受到任何性能影响。