es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo expresar que una función, al devolver un valor, ya no hace referencia a sus parámetros pasados por referencia o por puntero?

En C++, es común que las funciones tengan parámetros de paso por referencia o paso por puntero, siendo estos últimos también utilizados en C. (Por conveniencia, solo hablaré de punteros en las siguientes discusiones. Pero el problema existe para ambos casos). El problema es, ¿la función almacenará los punteros en algún lugar con una extensión más larga que la llamada a la función y los utilizará después de que la función haya terminado? Si es así, el llamador de la función debe mantener los valores apuntados por los punteros hasta que los punteros caduquen.

En C++, shared_ptr puede ser una solución, pero con sobrecargas notables de memoria en el heap y seguridad en el hilo. unique_ptr no es aplicable ya que el llamador desea conservar la propiedad.

Lo que estoy buscando es alguna construcción del lenguaje como const que pueda ser aplicada en tiempo de compilación, sin incurrir en sobrecargas durante la ejecución. Digamos que su nombre es short_lived. Un short_lived T* ptr es un puntero ptr a un valor de tipo T. Una función que recibe ptr como parámetro no debería almacenar el valor de ptr en ningún lugar con una extensión más larga que la llamada actual a la función (por ejemplo, una variable global), tanto en la función actual como en cualquier sub-función llamada desde dentro de la función actual. La restricción de “sub-funciones” posterior significa que ptr no debería pasarse a sub-funciones como un puntero no short_lived. Dado que la extensión de las variables es más una propiedad de tiempo de ejecución, para una implementación simple, el compilador puede prohibir todas las asignaciones desde punteros short_lived en la función receptora.

¿Se ha implementado el comportamiento concebido anteriormente en los estándares contemporáneos de C/C++? Si no es así, ¿cuáles son las razones?

¡Gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Hasta ahora, no existe una construcción de lenguaje como short_lived en los estándares contemporáneos de C/C++. El comportamiento que has concebido requeriría una aplicación de la extensión de variables en tiempo de compilación, lo cual es típicamente una propiedad en tiempo de ejecución. Por lo tanto, implementar una construcción de ese tipo requeriría cambios significativos en el lenguaje y compiladores de C/C++.

    El problema de los punteros que apuntan a ubicaciones de memoria expiradas es un problema común en C/C++, y existen diversas soluciones como punteros inteligentes, gestión cuidadosa de memoria y diseño cuidadoso de funciones e interfaces. Además, las revisiones de código y otras mejores prácticas pueden ayudar a prevenir problemas causados por el uso incorrecto de punteros.

    Introducir una nueva construcción de lenguaje como short_lived agregaría complejidad al lenguaje y potencialmente confundiría a los desarrolladores. Además, la aplicación de la extensión de variables en tiempo de compilación limitaría la flexibilidad del lenguaje y podría dificultar la implementación de ciertos algoritmos y estructuras de datos que requieren punteros de mayor duración.

    Por lo tanto, es poco probable que una construcción como short_lived se agregue a los estándares contemporáneos de C/C++ en un futuro cercano. En su lugar, los desarrolladores deben seguir utilizando las mejores prácticas y técnicas existentes para gestionar el ciclo de vida de las variables puntero.

Comments are closed.