Los handles son mejores que los punteros
Handles are the better pointers (2018)
Tras 15 años lidiando con grandes bases de código C++ y smart pointers, el autor propone reemplazar punteros por 'index-handles' respaldados por arrays gestionados centralizadamente. Esta técnica evita fugas falsas, fragmentación y errores de caché, y añade comprobaciones de seguridad en tiempo de ejecución. Aunque encaja mejor con arquitecturas orientadas a datos, ofrece ideas valiosas para cualquier lenguaje con recolección de basura.
La esencia es: mover toda la gestión de memoria a sistemas centralizados, agrupar elementos del mismo tipo en arrays y devolver solo un 'index-handle' al mundo exterior, nunca un puntero al elemento.
- boricj
Eso es básicamente lo que he hecho en el trabajo en mi proyecto de sistemas embebidos.
Grupos de objetos, con índices y generaciones. Muchísimo más fácil que meterse con punteros crudos, más barato que shared_ptr/weak_ptr y no requiere limpieza al eliminar cosas porque la generación almacenada no coincidirá con la generación del nuevo objeto. Incluso puedes hacer que sea construible por defecto si incrementas la generación también en la instanciación (de modo que solo las generaciones pares estén vivas) y ocultar todo detrás de abstracciones de alto nivel con C++.
Aunque mi conocimiento de estas técnicas proviene de arquitecturas de videojuegos de los 2000, ya que se sabe que juegos como GTA: Vice City las usan.
- nickwanninger
Mi tesis doctoral trata sobre este tema, y hace unos años tuve un artículo en ASPLOS sobre soporte de memoria basado en handles en lenguajes no gestionados (C/C++) a través de LLVM: https://nickw.io/papers/asplos24-alaska.pdf
La sobrecarga que vimos allí es sorprendentemente solo por la sobrecarga de instrucciones y saltos al usar handles por software; tengo trabajo en curso para hacerlo en hardware y las sobrecargas son mucho menores.
- Conscat
Hice un intento real de programar de esta manera en mi proyecto de C++ (en gran parte debido a este artículo), y personalmente lo encontré extremadamente engorroso porque tienes que llevar el propietario de este recurso a todas partes donde quieras usar el handle. Eso en sí puede empeorar el rendimiento cuando está en funciones diferentes, dificultó la programación genérica y ese código tiene que ser más pesado en plantillas, y fue difícil de refactorizar.
Pero este era un proyecto de muy bajo nivel, y sospecho que Floooh probablemente pensaba más en aplicaciones de usuario final.