Swift의 구현 세부 사항을 읽으려고 노력 중이며, "증거 테이블"이라고 적어 둘 수 없습니다. 그것들은 구조체에 사용되는 별도의 vtable 포인터 인 것 같습니다.
그러나 왜 그렇게해야합니까? Structs는 값별로 복사되므로 컴파일 타임에 어떤 유형인지 이미 알고 있습니다. 따라서 어떤 메소드를 호출하고 수행해야하는지 하드 코딩하지 않습니까? 이러한 방법으로 가상 디스패치를 수행하는 이유는 무엇입니까?
Swift의 구현 세부 사항을 읽으려고 노력 중이며, "증거 테이블"이라고 적어 둘 수 없습니다. 그것들은 구조체에 사용되는 별도의 vtable 포인터 인 것 같습니다.
그러나 왜 그렇게해야합니까? Structs는 값별로 복사되므로 컴파일 타임에 어떤 유형인지 이미 알고 있습니다. 따라서 어떤 메소드를 호출하고 수행해야하는지 하드 코딩하지 않습니까? 이러한 방법으로 가상 디스패치를 수행하는 이유는 무엇입니까?
답변:
Structs는 Swift에서 프로토콜이라는 인터페이스를 구현할 수 있습니다. 프로토콜 인 매개 변수, 변수 또는 필드 / 멤버를 가질 수 있으며, 클래스를 언급하지 않는 여러 다른 구조체는 프로토콜 매개 변수에 구조체를 전달 (또는 할당)하면 동일한 프로토콜을 구현할 수 있으므로 변수 또는 필드)의 구조에 대한 구체적인 내용은 "손실"(re : 컴파일 시간)이며 프로토콜 감시 테이블이 실행됩니다 (re : runtime).
Swift 메모리 레이아웃 에 대해 자세히 알아볼 수 있습니다 .
내가 익숙한 C #에서도 비슷한 일이 발생합니다. 인터페이스 변수 또는 필드 / 멤버에 전달되거나 할당 된 구조체는 박스로 묶여 있고, 박스로 표시된 구조체는 클래스 표현과 일치합니다. 이는 박스형 구조체에 대한 vtable이 있음을 의미합니다.
C #과 Swift는 항목이 컴파일 타임에 구조체로 알려진 경우 직접 호출을 수행하고 컴파일 타임에 vtable 디스패치를 사용할 것으로 예상합니다. 항목은 인터페이스로만 알려져 있습니다.