2009-07-22 4 views

Répondre

20

Il est une indication pour le compilateur que la fonction/procédure devrait être (si possible) inline, à savoir quand vous l'appelez, il devrait être étendu comme une macro au lieu d'être appelé.

Ceci est une optimisation pour (très) petites fonctions où le temps système d'un appel serait significatif. Vous trouverez de nombreux exemples dans par exemple windows.pas

Ce qui se passe réellement dépend de la complexité de la fonction, de l'accès public/privé et de votre version Delphi.

+0

Est-ce vraiment le compilateur qui s'occupe réellement de cette directive? J'ai essayé de compiler une unité en utilisant 'Borland Delphi Version 15.0' mais il n'a pas pu trouver la directive inline. –

+0

en ligne est D2005 +, mais fonctionne uniquement unité croisée depuis D2006 iirc. Et oui, le compilateur le fait. Ce n'est pas vraiment comme une macro (l'inline ne fonctionne pas au niveau de la source, mais un niveau plus profond, après analyse, sur le niveau de code généré) –

11

Il dit au compilateur de générer du code pour le en ligne; routine sur l'endroit où il est appelé, au lieu de sauter à la routine et de retour.

Pour les procédures qui se traduisent par un assembleur très court, cela peut être un avantage pour les performances, car le code réel est relativement court par rapport à la préparation des paramètres, l'appel réel et la procédure prologue/épilogue.

Si la procédure est trop longue, cela risque de freiner les performances et de gonfler votre code de manière gigantesque.

+0

+1 Je préfère cette réponse. Très bien expliqué. –

11

D'autres ont répondu à ce que fait en ligne, mais je voulais juste souligner qu'il existe une option de compilateur pour activer, désactiver ou auto. Consultez "Calling Procédures et fonctions" dans les documents D2009 pour une très bonne explication de la mécanique de l'inline. Voici le lien vers la documentation en ligne:

Delphi Online Docs for inline

1

Il est emprunté à C en ce qu'il indique au compilateur que c'est une routine courte qui est souvent appelé et il recommande que le compilateur traite la fonction comme une macro et intègre le code de fonction directement dans le programme au point appelé plutôt que d'utiliser un appel de fonction.

Cela donne un code plus rapide car il n'y a pas de surcharge d'appel de fonction, mais au détriment d'un programme plus important. Notez aussi que comme dans C c'est une recommandation au compilateur, il n'a pas réellement à faire ainsi et l'optimiseur peut vous remplacer.

Où faire cela? Bien comme le déroulement de la boucle, c'est une technique qui est très rarement utilisée de nos jours. L'endroit classique où l'utiliser est une structure imbriquée qui est critique en temps réel, comme le rendu du code dans une application graphique où quelques appels de machine rasés à chaque itération peuvent augmenter le taux de rafraîchissement de l'écran.

+0

Le D2005 inline est ce que vous décrivez. Le Delphi 2006+ inline peut intégrer une unité de compilation croisée sans déclarer la fonction entièrement dans un en-tête. C'est beaucoup plus difficile et quelque chose que C n'est pas capable de standard (bien que certains systèmes d'optimisation globale essayent) –

0

Appuyez sur Ctrl + Alt + C (fenêtre de débogage de l'ensemble du processeur) pendant le débogage dans Delphi, avant d'appeler votre fonction inline. Et vous verrez que les fonctions en ligne commencent sans "appel" et que vous passez à une autre adresse. C'est la fonctionnalité d'optimisation.

Questions connexes