Swift에 증인 테이블이 필요한 이유는 무엇입니까?


10

Swift의 구현 세부 사항을 읽으려고 노력 중이며, "증거 테이블"이라고 적어 둘 수 없습니다. 그것들은 구조체에 사용되는 별도의 vtable 포인터 인 것 같습니다.

그러나 왜 그렇게해야합니까? Structs는 값별로 복사되므로 컴파일 타임에 어떤 유형인지 이미 알고 있습니다. 따라서 어떤 메소드를 호출하고 수행해야하는지 하드 코딩하지 않습니까? 이러한 방법으로 가상 디스패치를 ​​수행하는 이유는 무엇입니까?


1
그 구조 증인 테이블에 대한 몇 가지 리소스를 가리킬 수 있습니까? 내가 찾은 모든 것은 프로토콜 감시 테이블입니다.
Jörg W Mittag

답변:


12

Structs는 Swift에서 프로토콜이라는 인터페이스를 구현할 수 있습니다. 프로토콜 인 매개 변수, 변수 또는 필드 / 멤버를 가질 수 있으며, 클래스를 언급하지 않는 여러 다른 구조체는 프로토콜 매개 변수에 구조체를 전달 (또는 할당)하면 동일한 프로토콜을 구현할 수 있으므로 변수 또는 필드)의 구조에 대한 구체적인 내용은 "손실"(re : 컴파일 시간)이며 프로토콜 감시 테이블이 실행됩니다 (re : runtime).

Swift 메모리 레이아웃 에 대해 자세히 알아볼 수 있습니다 .


내가 익숙한 C #에서도 비슷한 일이 발생합니다. 인터페이스 변수 또는 필드 / 멤버에 전달되거나 할당 된 구조체는 박스로 묶여 있고, 박스로 표시된 구조체는 클래스 표현과 일치합니다. 이는 박스형 구조체에 대한 vtable이 있음을 의미합니다.

C #과 Swift는 항목이 컴파일 타임에 구조체로 알려진 경우 직접 호출을 수행하고 컴파일 타임에 vtable 디스패치를 ​​사용할 것으로 예상합니다. 항목은 인터페이스로만 알려져 있습니다.


1
"나는 항목이 구조체로 컴파일 타임에 알려진 경우 C # 및 스위프트 모두 직접 전화를 거는 기대,"그래,이 과정이라는 것입니다 devirtualization은
알렉산더 - 분석 재개 모니카

위의 링크는 더 이상 작동하지 않습니다. github.com/apple/swift/blob/master/docs/ABI/TypeLayout.rst 참조하고 싶을 것입니다 .
Martin R
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.