Cuatro niveles para la inicialización en el lugar en Rust

Fuentes: Four levels of in-place initialization

La inicialización en el lugar (in-place initialization) permite construir tipos directamente en una posición de memoria, sin movimientos ni copias adicionales. Resulta especialmente útil con tipos grandes —donde puede evitar desbordamientos de pila— y resulta imprescindible para los tipos sensibles a la dirección, que no pueden moverse por razones de corrección. En Rust no existe hoy un mecanismo único que cubra todos los casos, por lo que el autor propone una jerarquía de cuatro niveles.

El nivel 0 se apoya en punteros crudos y MaybeUninit: es la opción más flexible, pero traslada toda la responsabilidad al programador mediante unsafe. Es la base de crates como pin-init y placing. El nivel 1 introduce referencias seguras como &uninit y &own (propuesta de Ding Xiang Fei), que llevan los lugares no inicializados a ciudadanas de primera clase y permiten inicializarlos de forma comprobable por el compilador, incluso entre funciones.

El nivel 2 son las placing functions, anotadas con un efecto emplace (expresable con la notación with): reescriben el return para escribir sobre un puntero de salida, mejorando la ergonomía y permitiendo devolver tipos !Move, requisito para constructores seguros de tipos autorreferenciales. El nivel 3 es la eliminación automática de movimientos en MIR (RFC 3943 de Amanieu): el propio compilador decide cuándo emplazar, como optimización. Su limitación es que, al ser un detalle del compilador, no permite devolver tipos no movibles.

La propuesta defiende que la coexistencia de estos cuatro niveles —de mayor control a mayor conveniencia— cubre desde el código unsafe de bajo nivel hasta el código idiomático optimizado automáticamente, sin necesidad de elegir una sola característica.