トレイトオブジェクトの制限

// 著作権 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 バイト、ワイドポインタ
}
  • トレイトオブジェクトは、問題を解決するための限定的な方法です。

  • トレイトオブジェクトから具象型へダウンキャストしたい場合は、対象のトレイトが Any をスーパートレイトとして持つこと、またはトレイトオブジェクトがメインのトレイトと Any の両方に対するものであることを指定する必要があります。

    それでもなお、dyn MyTraitdyn Any にキャストする必要があります。

  • トレイトオブジェクトにはメモリ上のオーバーヘッドがあります。これは「ワイドポインタ」であり、データそのものへのポインタだけでなく、vtable 用の別のポインタも保持する必要があります。

  • トレイトオブジェクトは動的サイズ付き型であるため、実用上は参照型またはポインタ型を介してしか使用できません。

    トレイトオブジェクトを使用する際には、値のデリファレンスと関連するトレイトメソッドの呼び出しに関する基本的なオーバーヘッドがあります。