Skip to main content

การโทรหางคืออะไร?

ในการเขียนโปรแกรมคอมพิวเตอร์การโทรหางเป็นสถานการณ์เฉพาะภายในซอร์สโค้ดโปรแกรมซึ่งฟังก์ชันรูทีนย่อยหรือขั้นตอนจะส่งคืนค่าที่คาดหวังโดยเรียกใช้ฟังก์ชันอื่นแทนที่จะส่งผ่านตัวแปรที่ถือค่าคืนชื่อตัวเองแสดงว่าฟังก์ชั่นที่เรียกว่าการคำนวณค่าที่จะส่งคืนอยู่ที่ท้ายหรือหางของฟังก์ชั่นที่เรียกมันเพื่อให้ค่าส่งคืนการโทรหางเป็นที่สนใจของโปรแกรมเมอร์บางคนเพราะด้วยการปรับให้เหมาะสมหรือพฤติกรรมคอมไพเลอร์บางอย่างไม่มีการใช้พื้นที่สแต็กเพิ่มเติมเพื่อจัดเก็บตำแหน่งรหัสของฟังก์ชันหลักฟังก์ชั่นหางแทนจะใช้เพื่อสร้างรายงานค่าส่งคืนโดยตรงกลับไปยังจุดเรียกที่เรียกใช้ฟังก์ชันดั้งเดิมการใช้การโทรหางมีประโยชน์อย่างยิ่งในสถานการณ์ที่ใช้การเรียกซ้ำเนื่องจากจำนวนพื้นที่สแต็กที่ใช้ในการจัดเก็บที่อยู่ผู้โทรในกรณีที่การเรียกซ้ำ NEST อย่างลึกซึ้งสามารถวิ่งออกไปอย่างรวดเร็วและหยุดการดำเนินการโปรแกรมแม้ว่าการใช้การโทรหางสามารถช่วยเพิ่มความเร็วการใช้หน่วยความจำและประสิทธิภาพในโปรแกรม แต่ก็สามารถนำไปสู่สถานการณ์ที่ซอร์สโค้ดถูกปรับโครงสร้างให้ใช้การโทรในแบบที่ทำให้ยากต่อการดีบักและติดตามโดยเฉพาะอย่างยิ่งกรณีของกรณีของกรณีการเรียกซ้ำ.

การมีอยู่ของการโทรหางนั้นเกิดจากการทำงานของสแต็กการโทรภายในโปรแกรมคอมพิวเตอร์และสถาปัตยกรรมระบบส่วนใหญ่สแต็คซึ่งเป็นเหมือนแผ่นแผ่นเป็นโครงสร้างข้อมูลครั้งแรกในครั้งแรกเมื่อมีการเรียกฟังก์ชั่นรูทีนย่อยหรือขั้นตอนที่อยู่ที่อยู่ซึ่งเรียกว่าเฟรมสแต็กจะถูกเก็บไว้ในสแต็กซึ่งหมายความว่าโปรแกรมที่เรียกใช้ฟังก์ชัน A ซึ่งเรียกใช้ฟังก์ชัน B จะมีเฟรมสแต็กสองอันหนึ่งอันสำหรับฟังก์ชั่น B และอีกอันที่อยู่ข้างใต้สำหรับฟังก์ชั่น A หลังจากฟังก์ชั่น B เสร็จสิ้นการดำเนินการเสร็จสิ้นเฟรมสแต็กของมันจะถูกผุดขึ้นมาจากด้านบนของด้านบนของสแต็กและการดำเนินการกลับไปที่ฟังก์ชั่น A ซึ่งมีเฟรมของมันโผล่ออกมาจากสแต็กเมื่อเสร็จสิ้นในที่สุดการควบคุมโปรแกรมกลับไปยังจุดที่ฟังก์ชันแรกถูกเรียกตอนแรก

เมื่อใช้การโทรหางฟังก์ชั่นโดยตรงใช้ค่าส่งคืนของฟังก์ชั่นอื่นเป็นข้อมูลที่จะส่งไปยังรหัสการโทรในตัวอย่างข้างต้นหากฟังก์ชั่นการเรียกใช้ฟังก์ชัน B โดยตรงกับคำสั่ง return การโทรหางได้ถูกสร้างขึ้นภายในสแต็คการโทรแทนที่จะมีเฟรมสแต็กสำหรับทั้งสองฟังก์ชั่น A และ B ฟังก์ชั่น B จะได้รับที่อยู่ส่งคืนจาก Function A และ Function A ของ Function A Stack Frame จะถูก popped และกำจัดฟังก์ชัน B จะผ่านค่าคืนกลับโดยตรงไปยังตำแหน่งที่เรียกว่าฟังก์ชั่น A โดยไม่ต้องผ่านการควบคุมกลับไปยังฟังก์ชั่น A. นี่จะเป็นการเพิ่มความเร็วของการโทรฟังก์ชันรวมถึงช่วยลดปริมาณข้อมูลในสแต็กลง

คุณสมบัติของการโทรหางสามารถทำได้พวกเขาเป็นตัวเลือกที่น่าสนใจมากสำหรับฟังก์ชั่นการเรียกซ้ำฟังก์ชั่นการเรียกซ้ำเป็นสิ่งที่เรียกตัวเองซ้ำ ๆ เพื่อคำนวณค่าซึ่งอาจเป็นกรณีเมื่อข้ามโครงสร้างข้อมูลรายการไม่มีการสร้างเฟรมสแต็กเพิ่มเติมสำหรับการเรียกฟังก์ชั่นซ้อนกันดังนั้นระดับการเรียกซ้ำที่ลึกมากจึงสามารถทำได้อย่างปลอดภัยโดยไม่ต้องคุกคามจากสแต็กล้นและการยกเลิกโปรแกรมที่เป็นไปได้