¿Cómo obtener la longitud de una función en bytes?

Quiero saber la duración de la función C (escrita por mí) en tiempo de ejecución. ¿Algún método para obtenerlo? Parece que sizeof no funciona aquí.

No es posible en la norma C obtener la cantidad de memoria ocupada por una función.

Hay una manera de determinar el tamaño de una función. El comando es:

nm -S  

Esto devolverá los tamaños de cada función dentro del archivo objeto. Consulte las páginas del manual en GNU usando ‘man nm’ para reunir más información al respecto.

Puede obtener esta información del vinculador si está utilizando un script de enlazador personalizado. Agregue una sección del enlazador solo para la función dada, con símbolos del enlazador en cada lado:

 mysec_start = .; *(.mysection) mysec_end = .; 

Luego puede asignar específicamente la función a esa sección. La diferencia entre los símbolos es la duración de la función:

 #include  int i; __attribute__((noinline, section(".mysection"))) void test_func (void) { i++; } int main (void) { extern unsigned char mysec_start[]; extern unsigned char mysec_end[]; printf ("Func len: %lu\n", mysec_end - mysec_start); test_func (); return 0; } 

Este ejemplo es para GCC, pero cualquier cadena de herramientas C debe tener una forma de especificar a qué sección asignarle una función. Verificaría los resultados contra la lista del ensamblado para verificar que esté funcionando de la manera que desea.

Los ejecutables (al menos los que tienen información de depuración eliminada) no almacenan longitudes de función de ninguna manera. Entonces no hay posibilidad de analizar esta información en tiempo de ejecución por sí mismo. Si tiene que manipular las funciones, debe hacer algo con sus objetos en la fase de vinculación o accediendo a ellos como archivos desde su ejecutable. Por ejemplo, puede decirle al vinculador que vincule las tablas de símbolos como una sección de datos ordinarios en el ejecutable, asígneles un nombre y analice cuando se ejecuta el progtwig. Pero recuerde, esto sería específico para su enlazador y formato de objeto.

También tenga en cuenta que el diseño de la función también es específico de la plataforma y hay algunas cosas que hacen que el término “longitud de la función” no sea claro:

  1. Las funciones pueden tener almacenar constantes utilizadas en las secciones de código directamente después del código de función y acceder a ellas usando el direccionamiento relativo de PC (los comstackdores ARM lo hacen).
  2. Las funciones pueden tener “prólogos” y “epilogs” que pueden ser comunes a varias funciones y, por lo tanto, se encuentran fuera del cuerpo principal.
  3. El código de función puede alinear otro código de función

Todos pueden contar o no contar en longitud de función.

También la función puede estar completamente delimitada por el comstackdor, por lo que pierde su cuerpo.

En, por ejemplo, Codewarrior, puede colocar tags alrededor de una función, por ejemplo

 label1: void someFunc() { /* code goes here. */ } label2: 

y luego calcule el tamaño como (int)(label2-label1) , pero obviamente esto es muy dependiente del comstackdor. Dependiendo de su sistema y comstackdor, es posible que tenga que hackear scripts de enlazador, etc.

El inicio de la función es el puntero a la función, ya lo sabes.

El problema es encontrar el final, pero eso se puede hacer de esta manera:

 #include  int foo(void) { int i = 0; ++i + time(0); // time(0) is to prevent optimizer from just doing: return 1; return i; } int main(int argc, char *argv[]) { return (int)((long)main - (long)foo); } 

Funciona aquí porque el progtwig tiene SOLAMENTE DOS funciones por lo que si el código se reordena (se implementa principalmente antes de foo), entonces obtendrá un cálculo irrelevante (negativo), haciéndole saber que no funcionó de esta manera, pero que funcionaría si mueve el código foo () a main () – simplemente resta el tamaño principal () que obtuvo con la respuesta negativa inicial.

Si el resultado es positivo, entonces será correcto, si no se realiza el relleno (sí, algunos comstackdores inflan felizmente el código, ya sea por alineación o por otras razones menos obvias).

La conversión final (int) (larga) es para la portabilidad entre códigos de 32 bits y de 64 bits (los punteros a las funciones serán más largos en una plataforma de 64 bits).

Esto es fácil de transportar y debería funcionar razonablemente bien.

Simplemente reste la dirección de su función de la dirección de la siguiente función. Pero tenga en cuenta que puede no funcionar en su sistema, así que úsela solo si está 100% seguro:

 #include  int function() { return 0; } int function_end() { return 0; } int main(void) { intptr_t size = (intptr_t) function_end - (intptr_t) function; } 

No hay ninguna facilidad definida dentro del lenguaje C para devolver la longitud de una función; simplemente hay demasiadas variables involucradas (comstackdor, conjunto de instrucciones de destino, archivo de objeto / formato de archivo ejecutable, configuración de optimización, configuración de depuración, etc.). El mismo código fuente puede dar como resultado funciones de diferentes tamaños para diferentes sistemas.

C simplemente no proporciona ningún tipo de capacidad de reflexión para admitir este tipo de información (aunque los comstackdores individuales pueden proporcionar extensiones, como el ejemplo de Codewarrior citado por sskuce). Si necesita saber cuántos bytes ocupa su función en la memoria, tendrá que examinar el objeto generado o el archivo ejecutable directamente.

sizeof func no funcionará porque la expresión func se trata como un puntero a la función, por lo que obtendrás el tamaño de un valor de puntero, no la función en sí misma.

No hay una forma estándar de hacerlo ni en C ni en C ++. Naturalmente, podría existir formas específicas de implementación / plataforma de doiung it, pero no conozco ninguna

Puede encontrar la duración de su función C restando las direcciones de las funciones. Déjame darte un ejemplo

 int function1() { } int function2() { int a,b; //just defining some variable for increasing the memory size printf("This function would take more memory than earlier function ie function01 "); } int main() { printf("Printing the address of function01 %p\n",function01); printf("Printing the address of function02 %p\n",function02); printf("Printing the address of main %p\n",main); return 0; } 

Espero que obtenga su respuesta después de comstackrlo. Después de comstackr, podrá ver la diferencia en el tamaño de la función01 y la función2.

Nota: Normalmente hay 16bytes de diferencia entre una función y otra.