Trong khi bước qua một số mã Qt, tôi đã xem xét những điều sau đây. Chức năng QMainWindowLayout::invalidate()
có việc thực hiện sau đây:Tại sao trình biên dịch tạo ra assembly này?
void QMainWindowLayout::invalidate()
{
QLayout::invalidate()
minSize = szHint = QSize();
}
Nó được biên dịch như sau:
<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
Việc lắp ráp từ vô hiệu + 9 để làm mất hiệu lực + 36 có vẻ ngu ngốc. Đầu tiên mã viết -1 đến% rbx + 0x564 và% rbx + 0x568, nhưng sau đó nó tải -1 từ% rbx + 0x564 trở lại vào sổ đăng ký chỉ để ghi nó ra% rbx + 0x56c. Điều này có vẻ giống như một cái gì đó trình biên dịch sẽ dễ dàng có thể tối ưu hóa vào một động thái khác ngay lập tức.
Vì vậy, đây là mã ngu ngốc (và nếu như vậy, tại sao trình biên dịch sẽ không tối ưu hóa nó?) Hoặc bằng cách nào đó rất thông minh và nhanh hơn chỉ sử dụng một động thái khác ngay lập tức?
(Lưu ý:.. Mã này là từ bình thường xây dựng thư viện phát hành vận chuyển bởi ubuntu, vì vậy nó có lẽ đã được biên soạn bởi GCC trong chế độ tối ưu hóa minSize
và szHint
biến là các biến bình thường của loại QSize
)
QT là giao diện người dùng, đúng không? Bạn cần phải làm mất bao nhiêu lần để làm mất hiệu lực cửa sổ? Làm thế nào để thực hiện mà thực sự cần phải được? Loại tối ưu hóa vi mô mà bạn mô tả gần như chắc chắn không đáng để nỗ lực tối thiểu mà sẽ tích lũy được. –
Dường như tối ưu thực sự, có thể là trình tối ưu hóa lổ nhìn trộm chỉ không nhận được điều này. –
@RobertHarvey Nhưng đó không phải là vấn đề ở đây - OP không cố gắng tối ưu hóa, anh ấy đang cố hiểu lý do. –