Tratando de entender la opción gcc -fomit-frame-pointer

 C Programming >> Programación C >  >> Tags >> GCC
Tratando de entender la opción gcc -fomit-frame-pointer


Le pedí a Google que me diera el significado del gcc opción -fomit-frame-pointer , que me redirige a la siguiente declaración.



Según mi conocimiento de cada función, se creará un registro de activación en la pila de la memoria del proceso para mantener todas las variables locales y algo más de información. Espero que este puntero de marco signifique la dirección del registro de activación de una función.


En este caso, ¿cuáles son el tipo de funciones para las que no es necesario mantener el puntero del marco en un registro? Si obtengo esta información, intentaré diseñar la nueva función en base a eso (si es posible) porque si el puntero del marco no se mantiene en los registros, algunas instrucciones se omitirán en binario. Esto realmente mejorará notablemente el rendimiento en una aplicación donde hay muchas funciones.


Respuestas:


La mayoría de las funciones más pequeñas no necesitan un puntero de marco; las funciones más grandes PUEDEN necesitar uno.


Realmente se trata de qué tan bien el compilador logra rastrear cómo se usa la pila y dónde están las cosas en la pila (variables locales, argumentos pasados ​​​​a la función actual y argumentos que se preparan para una función que se va a llamar). No creo que sea fácil caracterizar las funciones que necesitan o no necesitan un puntero de cuadro (técnicamente, NINGUNA función TIENE que tener un puntero de cuadro; es más un caso de "si el compilador lo considera necesario para reducir la complejidad de otro código").


No creo que deba "intentar hacer que las funciones no tengan un puntero de marco" como parte de su estrategia para codificar; como dije, las funciones simples no las necesitan, así que use -fomit-frame-pointer , y obtendrá un registro más disponible para el asignador de registros, y guardará de 1 a 3 instrucciones sobre la entrada/salida de las funciones. Si su función necesita un puntero de marco, es porque el compilador decide que es una mejor opción que no usar un puntero de marco. No es un objetivo tener funciones sin un puntero de marco, es un objetivo tener un código que funcione correctamente y rápido.


Tenga en cuenta que "no tener un puntero de cuadro" debería brindar un mejor rendimiento, pero no es una varita mágica que brinda enormes mejoras, particularmente no en x86-64, que ya tiene 16 registros para empezar. En x86 de 32 bits, dado que solo tiene 8 registros, uno de los cuales es el puntero de la pila, y tomar otro como el puntero del marco significa que se toma el 25% del espacio de registro. Cambiar eso a 12.5% ​​es una gran mejora. Por supuesto, compilar para 64 bits también ayudará bastante.