Hãy xem xét ví dụ sau:
struct vector {
int size() const;
bool empty() const;
};
bool vector::empty() const
{
return size() == 0;
}
Mã lắp ráp được tạo cho vector::empty
(bằng tiếng kêu, với tối ưu hóa):
push rax
call vector::size() const
test eax, eax
sete al
pop rcx
ret
Tại sao nó phân bổ không gian ngăn xếp? Nó hoàn toàn không được sử dụng. Các push
và pop
có thể được bỏ qua. Các bản dựng tối ưu của MSVC và gcc cũng sử dụng không gian ngăn xếp cho chức năng này (xem trên godbolt ), vì vậy phải có một lý do.
@Bob__: Không. Tại sao tôi nên?
—
Bác sĩ Gut
vector::size()
không được định nghĩa trong ví dụ để mô phỏng rằng nó không được nội tuyến.
Vì vậy, làm thế nào một trình biên dịch có thể tối ưu hóa một cái gì đó mà nó không biết?
—
Bob__
@Bob__: Tôi nghĩ rằng việc biết việc thực hiện
—
Bác sĩ Gut
vector::size()
không liên quan đến việc phân bổ hoặc không phân bổ khung ngăn xếp cho vector::empty()
. Trong empty()
đó chỉ là gọi, bất kể nó là gì.
Chà, bạn đang gọi một hàm trả về một cái gì đó, bạn cần không gian cho điều đó (nếu bạn không biết gì hơn).
—
Bob__
this
tham số ngầm ?