Encuentra el tamaño de una función en C

Estoy aprendiendo los punteros de función, entiendo que podemos apuntar a funciones que usan punteros de función. Entonces asumo que permanecen en la memoria. ¿Se quedan astackdas o astackdas? ¿Podemos calcular el tamaño de ellas?

El espacio para el código es asignado estáticamente por el enlazador cuando construyes el código. En el caso de que un sistema operativo cargue su código, el cargador del sistema operativo solicita esa memoria del sistema operativo y el código se carga en él. De forma similar, los datos estáticos como su nombre sugiere se asignan en este momento, al igual que una stack inicial (aunque se pueden crear más stacks si se crean subprocesos adicionales).

Con respecto a la determinación del tamaño de una función, esta información es conocida por el vinculador, y en la mayoría de las cadenas de herramientas, el vinculador puede crear un archivo de mapa que incluya el tamaño y la ubicación de todos los objetos de memoria estática (es decir, aquellos que no están instanciados en la ejecución). tiempo en la stack o el montón).

No hay una forma garantizada de determinar el tamaño de una función en tiempo de ejecución (y hay pocas razones para hacerlo); sin embargo, si asume que el enlazador localizó las funciones que están adyacentes en el código fuente de forma secuencial en la memoria, entonces lo siguiente puede proporcionar un Indicación del tamaño de una función:

 int first_function() { ... } void second_function( int arg ) { ... } int main( void ) { int first_function_length = (int)second_function - (int)first_function ; int second_function_length = (int)main - (int)second_function ; } 

Sin embargo YMMV; Intenté esto en VC ++ y solo dio resultados válidos en una comstackción “Release”; los resultados para una comstackción de “depuración” no tenían ningún sentido real. Sugiero que el ejercicio es solo para interés y no tiene uso práctico.

Otra forma de observar el tamaño de su código, por supuesto, es mirar el desassembly del código en su depurador, por ejemplo.

Las funciones son parte del segmento de texto (que puede o no ser ‘montón’) o su equivalente para la architecture que utiliza. No hay datos de comstackción pasada con respecto a su tamaño, como máximo puede obtener su punto de entrada desde la tabla de símbolos (que no tiene que estar disponible). Por lo tanto, no puede calcular su tamaño en la práctica en la mayoría de los entornos C que encontrará.

Están (normalmente) separados de la stack o el montón.

Hay formas de encontrar su tamaño, pero ninguna de ellas es siquiera portátil. Si crees que necesitas / quieres saber el tamaño, es muy probable que estés haciendo algo que probablemente deberías evitar.

Para hacerlo simple, las funciones no suelen ir a la stack o al montón porque están destinadas a ser datos de solo lectura, mientras que la stack y el montón son memorias de lectura y escritura.

¿Realmente necesitas saber su tamaño en tiempo de ejecución? Si no, puede obtenerlo mediante un simple objdump -t -i .text a.out donde a.out es el nombre de su binario. El .text es donde el enlazador coloca el código, y el cargador puede elegir que esta memoria sea de solo lectura (o incluso solo de ejecución). Si es así, como se ha respondido en publicaciones anteriores, hay maneras de hacerlo, pero es complicado y no portátil … Clifford dio la solución más directa, pero el enlazador rara vez pone la función de manera secuencial en la final. binario. Otra solución es definir secciones en su script de vinculador con pragmas, y reservar un almacenamiento para una variable global que se llenará mediante el vinculador con la sección SIZEOF (…) que contiene su función. Es dependiente del enlazador y no todos los enlazadores proporcionan esta función.

Como se ha dicho anteriormente, el comstackdor genera los tamaños de las funciones en el momento de la comstackción, y el enlazador conoce todos los tamaños en el momento de los enlaces. Si es absolutamente necesario, puede hacer que el enlazador elimine un archivo de mapa que contenga la dirección de inicio, el tamaño y, por supuesto, el nombre. A continuación, puede analizar esto en tiempo de ejecución en su código. Pero no creo que haya una manera portátil y confiable de calcularlos en tiempo de ejecución sin sobrepasar los límites de C.

El kernel de Linux hace un uso similar de esto para la generación de perfiles en tiempo de ejecución.

C no tiene recolector de basura. Tener un puntero a algo no hace que se quede en la memoria.

Las funciones están siempre en la memoria, ya sea que las uses o no, si mantienes un puntero sobre ellas o no.

La memoria asignada dinámicamente se puede liberar, pero no tiene nada que ver con mantener un puntero hacia ella. No debe mantener el puntero a la memoria que ha liberado, y debe liberarlo antes de perder el puntero, pero el idioma no lo hace automáticamente.

Si hay algo como el tamaño de la función, debe ser su TAMAÑO DE MARCO DE APILADO. O mejor aún, por favor, trate de contemplar qué exactamente, según usted, debería ser el tamaño de una función? ¿Te refieres a su tamaño estático, que es el tamaño de todo su código de operación cuando se carga en la memoria? Si eso es lo que quieres decir, entonces no veo su característica de lenguaje proporcionado para averiguarlo. hack. No puede haber un montón. Pero no he intentado eso.