Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Ограничения объектов трейтов

// 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.

  • Объекты трейтов — динамически размерные типы, поэтому на практике их можно использовать только через ссылки или указатели.

    При использовании объектов трейтов есть базовые накладные расходы на разыменование значения и вызов соответствующих методов трейта.