ลองพิจารณาตัวอย่างต่อไปนี้:
struct vector {
int size() const;
bool empty() const;
};
bool vector::empty() const
{
return size() == 0;
}
รหัสการประกอบที่สร้างขึ้นสำหรับvector::empty
(โดยเสียงดังกราวด้วยการเพิ่มประสิทธิภาพ):
push rax
call vector::size() const
test eax, eax
sete al
pop rcx
ret
ทำไมมันจัดสรรพื้นที่สแต็ค? มันไม่ได้ใช้เลย push
และpop
อาจถูกมองข้าม บิลด์ที่ปรับให้เหมาะสมของ MSVC และ gcc ยังใช้พื้นที่สแต็กสำหรับฟังก์ชั่นนี้ (ดูที่godbolt ) ดังนั้นต้องมีเหตุผล
@Bob__: ไม่ทำไมต้องฉัน
—
ดร. Gut
vector::size()
ไม่ได้กำหนดไว้ในตัวอย่างเพื่อจำลองว่าไม่มีการ inlined
ดังนั้นคอมไพเลอร์สามารถเพิ่มประสิทธิภาพสิ่งที่มันไม่รู้ได้อย่างไร
—
Bob__
@Bob__: ผมคิดว่าการเรียนรู้การดำเนินงานของไม่เกี่ยวข้องกับการจัดสรรหรือไม่จัดสรรกองกรอบสำหรับ
—
ดร. Gut
vector::size()
vector::empty()
ในempty()
มันถูกเรียกว่าอะไรก็ตามที่มันเป็น
คุณกำลังเรียกฟังก์ชั่นที่ส่งคืนบางสิ่งคุณต้องการพื้นที่สำหรับสิ่งนั้น (ถ้าคุณไม่รู้อะไรเพิ่มเติม)
—
Bob__
this
พารามิเตอร์โดยนัยหรือไม่