2009-07-22 17 views

Respuesta

20

Es una sugerencia para el compilador que la función/procedimiento debería ser (si es posible) inline, es decir, cuando usted lo llama debería expandirse como una macro en lugar de ser llamado.

Esta es una optimización para funciones (muy) pequeñas donde la sobrecarga de una llamada sería significativa. Encontrará muchos ejemplos en, por ejemplo, windows.pas

Lo que realmente sucede depende de la complejidad de la función, el acceso público/privado y su versión Delphi.

+0

¿Es realmente el compilador quien realmente se ocupa de esta directiva? Intenté compilar una unidad usando 'Borland Delphi Version 15.0' pero no pude encontrar la directiva en línea. –

+0

en línea es D2005 + pero solo funciona la unidad cruzada desde D2006 iirc. Y sí, el compilador lo hace. Tampoco es realmente como una macro (la línea de entrada no funciona en el nivel de fuente, pero un nivel más profundo, después del análisis, en el nivel de código generado) –

11

Le dice al compilador que genere código para el en línea; rutina en el lugar donde se llama, en lugar de saltar a la rutina y volver.

Para los procedimientos que se traducen en ensamblador muy corto, esto puede ser un beneficio para el rendimiento, porque el código real es relativamente corto en comparación con la preparación del parámetro, la llamada real y el procedimiento prólogo/epílogo.

Si el procedimiento es demasiado largo, puede ser un freno en el rendimiento sin embargo, e inflar su código de forma espectacular.

+0

+1 Prefiero esta respuesta. Muy bien explicado. –

11

Otros han respondido lo que hace en línea, pero solo quería señalar que hay una opción de compilación para establecer en línea encendido, apagado o automático. Consulte "Procedimientos y funciones de llamada" en los documentos de D2009 para obtener una explicación muy buena de la mecánica de inline. Aquí está el enlace a los documentos en línea:

Delphi Online Docs for inline

1

Ha tomado de C en que le dice al compilador que se trata de una rutina corta que se llama con frecuencia y se recomienda que el compilador trata la función como una macro y integra el código de función directamente en el programa en el punto llamado en lugar de usar una llamada de función.

Esto proporciona un código más rápido porque no hay una sobrecarga de llamada de función, sino a expensas de un programa más grande. Tenga en cuenta también que, como en C, esta es una recomendación para el compilador, en realidad no tiene que hacerlo y el optimizador puede anularlo.

¿Dónde hacer esto? Bueno, como el desenrollado de lazo, es una técnica que rara vez se usa hoy en día. El lugar clásico para usar esto es profundo en una estructura anidada que es crítica en tiempo real, como la representación de código en una aplicación de gráficos donde algunas llamadas de máquina afeitadas en cada iteración pueden aumentar la frecuencia de actualización de la pantalla.

+0

El D2005 en línea es lo que describes. El Delphi 2006+ en línea puede alinear la unidad de compilación cruzada sin declarar la función completamente en un encabezado. Eso es mucho más difícil y algo que C normalmente no es capaz de hacer (aunque ciertos sistemas de optimización global lo intentan) –

0

Presione Ctrl + Alt + C (ventana completa de depuración de CPU) mientras realiza la depuración en Delphi, antes de llamar a su función en línea. Y verá que las funciones en línea comienzan sin "llamar" y que saltan a otra dirección. Es la función de optimización.

Cuestiones relacionadas