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.

¿Se puede distinguir un puntero al montón (heap) de las direcciones estáticas y automáticas?

Considera lo siguiente:

static void
classifyPointer(const void *p)
{
    ....
}
int main(int argc, char *argv[])
{
     const char *p1 = "Meow";
     char        p2[3];
     char       *p3 = malloc(11);

 classifyPointer(p1);    /* cadena literal */
 classifyPointer(p2);    /* pila */
 classifyPointer(p3);    /* heap */
 classifyPointer(main);  /* función */

 return 0;
}

¿Es posible implementar una función classifyPointer, capaz de clasificar las direcciones que se le pasan e imprimir el tipo de memoria a la que apuntan los argumentos?

Soy plenamente consciente de que no existe un método estándar garantizado para que esto funcione en cualquier lugar.

Sin embargo, sospecho que existen grupos lo suficientemente grandes de plataformas (como Unixes que utilizan ELF, o donde se utiliza jemalloc), donde esto es posible, al menos para algunas de las clases de memoria.

Y, si es posible, algunas optimizaciones útiles pueden ser valiosas en esas plataformas… Por ejemplo, varios objetos (como Tcl_Obj y equivalentes en otros intérpretes) hacen copias privadas de campos durante la construcción, asignando memoria, copiando los datos, liberando la memoria más tarde, todo lo cual es innecesario cuando los argumentos del constructor son cadenas literales solo-lectura.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como se mencionó en la indicación, no existe un método estándar para clasificar las direcciones de memoria, pero en algunos sistemas es posible hacerlo. En plataformas que utilizan el formato de archivo ELF (como los sistemas operativos basados en Unix), se puede determinar si un puntero se refiere a memoria en la pila, el heap o el almacenamiento global/estático. Esto se puede hacer examinando el rango de direcciones de memoria utilizado por la imagen ejecutable del programa, las bibliotecas compartidas y la asignación dinámica.

    Sin embargo, es importante tener en cuenta que este enfoque es específico de la plataforma y puede no funcionar en todos los sistemas. Además, la utilidad de tal optimización puede ser limitada ya que solo se aplica a ciertos tipos de objetos que se construyen a partir de literales de cadena de solo lectura.

    En conclusión, aunque es posible implementar una función para clasificar las direcciones de memoria en algunas plataformas, puede no ser una técnica de optimización confiable o ampliamente aplicable.

Comments are closed.