Rust Null Pointer Optimization

Índice

Cuando tenemos un enum con dos variantes, una de las cuales no tiene valor y la otra sí, el compilador hace que la memoria consumida por dicho enum sea igual a la que ocuparía el tipo envuelto en la variante que sí mantiene un valor.

Se ve más claro con el ejemplo canónico, Option. Se define así:

enum Option<T> {
    None,
    Some(T),
}

Como el valor que almacenemos será un puntero no nulo en el heap, su valor será distinto de 0x000000. Así que esta opción representará la variante None, y cuando tengamos otro valor significa que estaremos ante la variante Some(…), pero todos los bits representarán el valor almacenado. De esta forma nos ahorramos los bits necesarios para almacenar el tag. Resumiendo, Option<Foo> ocupa la misma memoria que Foo.

Referencias