Tại sao Swift cần bảng nhân chứng?


10

Tôi đang cố gắng đọc chi tiết triển khai của Swift và một điều tôi không thể hiểu được là "bảng nhân chứng" của nó. Có vẻ như chúng là một con trỏ vtable riêng được sử dụng cho các cấu trúc.

Nhưng tại sao bạn lại cần điều đó? Các cấu trúc được sao chép theo giá trị, vì vậy bạn đã biết tại thời điểm biên dịch chúng là loại gì. Vì vậy, bạn sẽ không mã hóa phương thức nào để gọi và được thực hiện với nó? Tại sao thực hiện công văn ảo trên các phương thức này?


1
Bạn có thể chỉ ra một số tài nguyên trên các bảng nhân chứng cấu trúc đó không? Tất cả những gì tôi có thể tìm thấy là các bảng chứng kiến ​​giao thức.
Jörg W Mittag

Câu trả lời:


12

Cấu trúc có thể thực hiện các giao diện, được gọi là giao thức trong Swift. Bạn có thể có một tham số, biến hoặc trường / thành viên là một giao thức và bởi vì nhiều cấu trúc khác nhau, chưa kể các lớp, có thể thực hiện cùng một giao thức đó, khi bạn chuyển (hoặc gán) một cấu trúc cho một tham số giao thức (hoặc biến hoặc trường), các chi tiết cụ thể mà cấu trúc của nó có thể đã bị "mất" (thời gian biên dịch lại) và bảng chứng kiến ​​giao thức đi vào hoạt động (re: runtime).

Bạn có thể tìm hiểu thêm về cách bố trí bộ nhớ Swift .


Điều tương tự cũng xảy ra trong C #, mà tôi quen thuộc hơn. Một cấu trúc được truyền hoặc gán cho một biến giao diện hoặc trường / thành viên được đóng hộp và biểu diễn được đóng hộp của cấu trúc khớp với biểu diễn của lớp, có nghĩa là có một vtable cho các cấu trúc được đóng hộp.

Tôi hy vọng cả C # và Swift sẽ thực hiện cuộc gọi trực tiếp khi mục được biết tại thời điểm biên dịch dưới dạng cấu trúc và sử dụng công văn vtable khi tại thời gian biên dịch, mục này chỉ được gọi là giao diện.


1
"Tôi hy vọng cả C # và Swift sẽ thực hiện các cuộc gọi trực tiếp khi vật phẩm được biết đến vào thời gian biên dịch dưới dạng cấu trúc", vâng, đây là một quá trình được gọi là ảo hóa
Alexander - Tái lập lại

Liên kết trên không hoạt động nữa. Bạn có thể muốn tham khảo github.com/apple/swift/blob/master/docs/ABI/TypeLayout.rst .
Martin R
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.