Принадлежні об’єкти трейтів
Раніше ми бачили, як об’єкти трейтів можна використовувати з посиланнями, наприклад, &dyn Pet
. Однак, ми також можемо використовувати об’єкти трейтів з розумними вказівниками, такими як Box
, щоб створити власний об’єкт трейту: Box<dyn Pet>
.
Розташування пам’яті після виділення pets
:
Speaker Notes
This slide should take about 10 minutes.
- Типи, що реалізують певний трейт, можуть бути різних розмірів. Це унеможливлює створення таких типів, як
Vec<dyn Pet>
у наведеному вище прикладі. dyn Pet
— це спосіб повідомити компілятору про тип динамічного розміру, який реалізуєPet
.- У прикладі
pets
розміщується у стеку, а векторні дані - у купі. Два векторні елементи є жирними вказівниками:- Жирний вказівник - це вказівник подвійної ширини. Він складається з двох компонентів: вказівника на власне об’єкт і вказівника на таблицю віртуальних методів (vtable) для реалізації
Pet
цього конкретного об’єкта. - Дані для
Dog
на ім’я Фідо - це поляname
таage
. ДляCat
є полеlives
.
- Жирний вказівник - це вказівник подвійної ширини. Він складається з двох компонентів: вказівника на власне об’єкт і вказівника на таблицю віртуальних методів (vtable) для реалізації
- Порівняйте ці результати в наведеному вище прикладі:
println!("{} {}", std::mem::size_of::<Dog>(), std::mem::size_of::<Cat>()); println!("{} {}", std::mem::size_of::<&Dog>(), std::mem::size_of::<&Cat>()); println!("{}", std::mem::size_of::<&dyn Pet>()); println!("{}", std::mem::size_of::<Box<dyn Pet>>());