在逐步执行一些 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
and szHint
变量是普通类型的变量QSize
.)
当你说这是愚蠢的时候,不确定你是否正确。我认为编译器可能正在尝试优化这里的代码大小。没有 64 位立即到内存的 mov 指令。因此编译器必须像上面那样生成 2 个 mov 指令。每个都是 10 个字节,生成的 2 个动作是 14 个字节。它已被写入,因此很可能没有内存延迟,因此我认为您不会在这里受到任何性能影响。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)