Ограничения объектов трейтов
// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0
use std::any::Any;
pub trait Trait: Any {}
impl Trait for i32 {}
fn main() {
dbg!(size_of::<i32>()); // 4 байта, значение с владением
dbg!(size_of::<&i32>()); // 8 байт, ссылка
dbg!(size_of::<&dyn Trait>()); // 16 байт, широкий указатель
}
-
Объекты трейтов — ограниченный способ решения задач.
-
Если нужно привести объект трейта обратно к конкретному типу (downcast), придётся указать, что соответствующий трейт имеет
Anyв качестве супертрейта, или что объект трейта строится над основным трейтом иAny.Даже в этом случае всё равно придётся привести
dyn MyTraitкdyn Any. -
Объекты трейтов создают накладные расходы по памяти: это «широкие указатели», которые должны хранить не только указатель на сами данные, но и ещё один указатель на vtable.
-
Объекты трейтов — динамически размерные типы, поэтому на практике их можно использовать только через ссылки или указатели.
При использовании объектов трейтов есть базовые накладные расходы на разыменование значения и вызов соответствующих методов трейта.