Si uso funciones en línea, ¿el uso de memoria aumenta?C Funciones en línea y uso de memoria
Respuesta
Depende de la función. Las líneas sencillas pueden tener una reducción de memoria ya que no es necesario configurar y limpiar la llamada y no se realiza ninguna llamada de función. Si la función es más grande que esta sobrecarga necesaria para llamar a una función, entonces, por supuesto, inflará el código.
Las funciones en línea definitivamente aumentan el tamaño de su ejecutable final (o binario), ya que serán "copiadas y pegadas" donde quiera que las llame.
Lo siento, pero su respuesta es incompleta y está incluida en las respuestas anteriores. –
En general, el programa aumentará de tamaño (estoy seguro de que hay excepciones). El consumo de memoria del tiempo de ejecución puede disminuir, pero no por mucho.
¿Por qué estás preguntando? Normalmente, permite que el compilador determine si una función debe estar en línea o no; generalmente puede hacer una mejor llamada dado el tamaño y la complejidad de la función.
Hay otro punto que hay que considerar:
Usando las funciones en línea, el compilador es capaz de ver donde se van a utilizar como variables en el llamado variables de la persona que llama. El compilador puede optimizar (a menudo esto es realmente muchas líneas de ensamblador que pueden omitirse. Tenga cuidado con el llamado código "redundante") basado en ese conocimiento. Por lo tanto, su "hinchazón de código" a menudo no es tan grande, especialmente si tiene funciones más pequeñas, incluso puede reducir la hinchazón como Jim mencionó anteriormente.
Alguien hizo una buena observación: es mejor hacer que el compilador decida si enmarca la función en cuestión o no, ya que conoce el código que genera mejor que nunca.
Una llamada a una función requiere varias instrucciones del procesador.
Por lo general, necesita una instrucción PUSH para cada argumento de la función, una instrucción CALL para llamar a la función, y a menudo otra instrucción que limpia la pila después de la llamada a la función.
Además, las funciones pueden modificar los registros del procesador, por lo que la función de llamada puede necesitar más instrucciones para conservar los registros o volver a cargar los valores que de otro modo estarían en los registros.
Por lo tanto, si la función que está llamando tiene solo unas pocas instrucciones, puede ahorrar memoria y ejecutar más rápido.
Dicho esto, la alineación es para cuando su generador de perfiles le indique que debe hacerlo.
C define un ABI donde todos los parámetros se envían a la pila. C++ no define un ABI específico, lo que permite que las implementaciones del compilador usen registros para el paso de parámetros. Por lo tanto, en la mayoría de las situaciones, no todos los parámetros se enviarán a la pila. –
Eso realmente no responde en el caso general.
Para empezar, generalmente no tiene control sobre el forro interior. Incluso si marca una función en línea, en realidad todavía depende del compilador, ya que de hecho lo hará en el revestimiento (es solo una pista).
El compilador hará todo lo posible para optimizar el código; usar forro interior es solo una herramienta para hacer esto. Por lo tanto, la creación de funciones cortas hará que el código sea más pequeño (ya que no necesita configurar los parámetros para la llamada ni recuperar el valor de retorno.) Pero incluso con funciones largas, la respuesta no es absoluta.
Si el compilador decide en línea una función larga, entonces pensaría que el código sería más largo.Pero este no es generalmente el caso; ya que esto le da al compilador oportunidades adicionales para aplicar otras técnicas de optimización que podrían hacer que el código aún sea más pequeño. Si el análisis de los compiladores encuentra que la inflamación del código resultante es perjudicial para el código, no se realizará el revestimiento interno.
Básicamente, el compilador hace su análisis y decide el mejor curso de acción.
Conclusión. No te preocupes por eso El compilador es más inteligente que usted y hará lo correcto.
A veces ocurre que tenemos funciones dispersas por todo el programa. En este caso, una llamada a la función hace que el programa salte a la dirección de la función y regrese cuando finaliza la llamada a la función. Esto le quita un tiempo precioso.
El problema anterior se puede resolver con el uso de funciones en línea. Esto hace que el compilador llame el código directamente desde la fuente. No se crea un nuevo conjunto de instrucciones de memoria para el código de función en línea.
Aunque la declaración inline en C++ es libre y se produce automáticamente cuando la función se define en la declaración, en c está restringido por las reglas siguientes ::
en C, cualquier función con enlace interno puede declararse en línea, pero una función con enlace externo tiene restricciones en línea.
Si la palabra clave inline se usa en la declaración de la función, entonces la definición de la función debe estar presente en la misma unidad de traducción.
inline function_name tipo de datos (argumentos)
Este código se ejecuta hasta 30% Fastert de una función no en línea, el resto dependiendo de la velocidad prcessor.
Ahora viene la parte de la estrategia. Puede usar funciones en línea a su antojo, pero tenga en cuenta que las funciones en línea pueden tomar mucho menos tiempo para ejecutarse, pero tienen una ocupación de memoria alta durante la ejecución. Además, el compilador siempre tiene la opción de pasar por alto su declaración en línea si el código declarado en línea es anormalmente grande en comparación con el tamaño del código.
Declaración en línea aunque destruye el orden de evaluación, no hace que la función sea interna. La función sigue siendo externa.
Hay dos tipos de uso de la memoria que las funciones en línea afectarán:
tamaño del código — en, código general inlining aumentará la cantidad de memoria se utiliza para cargar el programa. Esto se debe a que habrá múltiples copias del código generado diseminadas por su programa. Sin embargo, esto no siempre es así: si su función en línea solo se usó una vez, hay pocos cambios, y si la función en línea es muy pequeña, puede obtener una reducción neta en el tamaño del código eliminando la sobrecarga de llamada de función. Además, el optimizador puede reducir el tamaño de la función para poder eliminar el código que no se utiliza en la invocación en línea particular.
uso de la pila — Si sus funciones en línea tienen muchas variables locales, entonces puede usar más espacio en la pila. En C, el compilador generalmente asigna el espacio de pila para una función una vez que ingresa a la función.Esto tiene que ser lo suficientemente grande como para contener todas las variables locales que no están almacenadas en los registros. Si llama a una función fuera de línea, la pila para esa función se usa hasta que vuelve, cuando se libera nuevamente. Si alinea la función, ese espacio de pila se mantendrá durante toda la vida de la función uber.
La alineación no afectará el uso del montón, ya que las mismas asignaciones y desasignaciones se producirían para el código en línea como ocurriría con la versión no en línea.
- 1. Funciones en línea en C++
- 2. Funciones de una línea en C?
- 3. Uso de funciones mín. Y máx. En C++
- 4. Como hacer funciones en línea en C#
- 5. C funciones en línea y error "indefinido externo"
- 6. ¿Hay algún inconveniente en el uso de funciones anónimas en JavaScript? P.ej. ¿uso de memoria?
- 7. En C++, ¿en qué memoria están las funciones de clase?
- 8. Funciones anónimas y consumo de memoria
- 9. Uso de delegados C# con funciones f #
- 10. C# Dictionary y uso eficiente de la memoria
- 11. Funciones recursivas en C/C++
- 12. inicializaciones actividad repetida y uso de memoria
- 13. pérdida de memoria Uso de JSON-C
- 14. asignación de memoria para las funciones en C++
- 15. Funciones en línea
- 16. Uso de memoria de datos centrales y advertencia de memoria
- 17. ¿Cómo evitar quedarse sin memoria en la aplicación de uso de memoria alta? C/C++
- 18. ¿Las funciones estáticas C# funcionan mejor que las funciones no estáticas, más allá del uso reducido de la memoria?
- 19. Uso de `en línea` en F #
- 20. retorno por valor funciones en línea
- 21. C# Creando y usando funciones
- 22. Uso del ensamblaje en línea en C/C++
- 23. Funciones dinámicas C++ y TOTALMENTE
- 24. Uso de funciones imap en PHP sin reconstrucción y reinstalación
- 25. Cómo obtener el uso de memoria en Windows en C++
- 26. C++ y protección de memoria de proceso
- 27. Haskell IO Monad y uso de memoria
- 28. Uso y clasificación de la memoria SAS
- 29. Comet, responseText y uso de memoria
- 30. plantilla de C++ y en línea
En el caso general, esto no responde. Si tiene un ejemplo específico, pruébelo y vea qué sucede. –