ทำไมสวิฟท์จึงต้องมีโต๊ะสำหรับพยาน?


10

ฉันพยายามอ่านรายละเอียดการใช้งาน Swift และสิ่งหนึ่งที่ฉันไม่สามารถตะลึงได้คือ "โต๊ะพยาน" ดูเหมือนว่าพวกเขาเป็นตัวชี้ vtable แยกที่ใช้สำหรับ structs

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


1
คุณสามารถชี้ไปที่แหล่งข้อมูลบางอย่างในตารางโครงสร้างพยานเหล่านั้นได้หรือไม่ ทั้งหมดที่ฉันได้พบคือตารางพยานโครงการ
Jörg W Mittag

คำตอบ:


12

Structs สามารถใช้อินเตอร์เฟสที่เรียกว่าโปรโตคอลใน Swift คุณสามารถมีพารามิเตอร์ตัวแปรหรือเขตข้อมูล / สมาชิกที่เป็นโปรโตคอลและเนื่องจากโครงสร้างที่แตกต่างกันหลายชั้นไม่รวมถึงคลาสสามารถใช้โปรโตคอลเดียวกันนั้นเมื่อคุณผ่าน (หรือกำหนด) โครงสร้างให้กับพารามิเตอร์โปรโตคอล (หรือ ตัวแปรหรือเขตข้อมูล) ข้อมูลเฉพาะของโครงสร้างที่อาจเป็นได้คือ "หลงทาง" (เวลา: เวลารวบรวม) และตารางพยานโครงการโปรโตคอลเข้ามาเล่น (อีกครั้ง: รันไทม์)

คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับรูปแบบของหน่วยความจำสวิฟท์


เกิดขึ้นคล้ายกันใน C # ซึ่งฉันคุ้นเคยมากขึ้น struct ผ่านหรือกำหนดให้กับตัวแปรอินเทอร์เฟซหรือเขตข้อมูล / สมาชิกจะถูกบรรจุกล่องและการแสดงโครงสร้างของกล่องตรงกับการเป็นตัวแทนระดับซึ่งหมายความว่ามี vtable สำหรับ structed ชนิดบรรจุกล่อง

ฉันคาดหวังว่าทั้ง C # และ Swift จะโทรโดยตรงเมื่อรายการนั้นรู้จักกันในเวลาคอมไพล์เป็น struct และใช้ vtable dispatch เมื่อถึงเวลาคอมไพล์รายการนั้นเป็นที่รู้จักกันในนามของอินเตอร์เฟสเท่านั้น


1
"ฉันคาดหวังว่าทั้ง C # และ Swift จะโทรออกโดยตรงเมื่อรายการนั้นเป็นที่รู้จักในเวลาคอมไพล์" อ๋อนี่เป็นกระบวนการที่เรียกว่าdevirtualization
Alexander - Reinstate Monica

ลิงค์ด้านบนใช้งานไม่ได้อีกต่อไป คุณอาจต้องการอ้างอิงgithub.com/apple/swift/blob/master/docs/ABI/TypeLayout.rst
Martin R
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.