Visualizando las vtables de Rust: cómo funciona dyn Trait en memoria

Visualizing Rust's Vtables: How dyn Trait Works In Memory

Visualizando las vtables de Rust: cómo funciona dyn Trait en memoria

Este artículo explora la implementación de la despacho dinámico en Rust a través de `dyn Trait`, comparándolo con el polimorfismo de C++. Se analiza la memoria de los vtables, los punteros anchos y los tipos de tamaño cero (ZST), mostrando cómo Rust maneja la identidad mediante el ownership en lugar de direcciones. Incluye experimentos prácticos para visualizar las diferencias entre despacho estático y dinámico, y cómo se elige en el sitio de llamada.

En Rust, la elección entre despacho estático y dinámico se hace en el sitio de llamada: `Circle` es solo `Circle`, no sabe nada sobre despacho; decides si usar `&Circle` para estático o `&dyn Draw` para dinámico.
  1. tialaramex

    Esta sección trata sobre la seguridad de objetos; he comprobado que el artículo fue escrito esta semana, pero "seguridad de objetos" es un nombre confuso para esta idea, y desde hace un tiempo Rust llama a este concepto "compatibilidad dyn" porque lo más importante que obtienes si un trait es "compatible dyn" es que puedes usar "dyn Trait" - https://doc.rust-lang.org/1.98.1/reference/items/traits.html... Ese enlace también explica las reglas de manera más exhaustiva.

    [Edición: Me he dado cuenta de que el final del artículo explica esto; el autor comenzó a escribirlo hace meses, probablemente antes de leer sobre la mejora del nombre "compatibilidad dyn".]

  2. Panzerschrek

    > Un trait debe seguir las llamadas reglas de seguridad de objetos para poder usarse como objeto de trait.

    Esto me parece un gran defecto de diseño de Rust. Intenta reutilizar los traits para el polimorfismo dinámico, aunque no encaje perfectamente. C++ es más honesto: tiene dos mecanismos separados para el polimorfismo estático (plantillas) y el dinámico (herencia).

  3. Panzerschrek

    Una vez me enfrenté a un bug complicado que involucraba punteros gordos (que contienen tablas virtuales) en Rust. Dos de estos punteros pueden ser distintos, incluso si hacen referencia al mismo objeto, porque (por alguna razón) el compilador puede crear dos (o incluso más) copias de la tabla de funciones virtuales y usarlas en diferentes lugares.

  4. evmar

    En mi propio viaje de descubrimiento encontré muy útil https://cheats.rs/, y en particular su sección de "diseño de memoria" tiene visualizaciones. (Sin afiliación con el sitio, ¡solo un lector satisfecho!)

  5. returningfory2

    Muy bueno. Como continuación, sería interesante también hacer ingeniería inversa de la estructura de la propia vtable. Supongo que es una lista de punteros a las implementaciones de los métodos, ¿no?

Más de este día

2026-09-05