DSTs는 Dynamic Sized Types의 약자로 런타임에 크기가 정해지는 타입을 뜻한다
현재 Rust에는 크게 trait object와 slice 2가지 DST가 있다 하나씩 살펴보자
먼저 trait object는 C#의 interface 객체와 비슷한데 타입상으로는 dyn Trait로 나타내진다 dynamic dispatch할때 사용된다
이 타입은 실제 타입이 뭔지 런타임에 결정되기 때문에 크기를 알수없어서 그대로는 존재할수 없고 오직 참조의 형태로만 존재한다
그리고 이 참조는 1워드 크기인 다른 참조와는 다르게 '실제' 타입의 참조 1워드와 그 타입의 가상함수 테이블 1워드해서 총 2워드 크기를 갖는다
비슷한 네이티브 언어인 C++와의 차이점은 C++에선 이 테이블이 구조체 자체에 박히는데 Rust에선 타입 변환할때 참조에 박힌다
이 타입으로 할수있는건 오로지 해당 Trait의 메소드를 호출하는거 뿐이고 다운캐스팅 같은건 그 안에서 알아서 하던가 해야한다
예를들어 &i32를 &dyn Display로 캐스팅 하는건 가능하지만 반대는 Display에 관련 메소드가 없으므로 불가능하다
그리고 slice는 C#의 Span과 비슷한데 타입상으로는 [T]로 나타낸다 str도 이쪽인데 [u8]의 utf8 버전이라고 보면된다
이 타입 역시 크기가 런타임에 정해지기에 그대로는 존재할수 없고 오직 참조의 형태로 존재하며
참조는 실제 위치 1워드 그 길이 1워드해서 2워드다 그 위치에 이 길이만큼 선형적으로 접근이 가능하다
얘도 캐스팅할때 대상 메모리의 길이가 참조에 박힌다
Rust에서 배열접근은 힙할당한 Vec인지 스택할당한 로컬 array인지 상관없이
이 slice를 통해 이루어지며 항상 들어있는 저 길이를 이용해서 범위체크를 하게된다
댓글 0