При переходе через некоторый код 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
.)