在逐步执行一些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在优化模式下编译的。minSizeszHint变量是QSize类型的常规变量。)

最佳答案

说傻话时不确定自己是对的。我认为编译器可能正在尝试在此处优化代码大小。内存mov指令没有64位立即数。因此,编译器必须像上面一样生成2条mov指令。他们每个将是10个字节,生成的2个移动是14个字节。它已被写入,因此很可能没有内存延迟,因此我认为您不会在此处受到任何性能影响。

10-07 13:06
查看更多