Est-ce que "What's wrong with using inline functions" et "Can a recursive function be inline" s'appliquent aux fonctions Delphi intégrées? En outre, quelqu'un sait-il comment les fonctions inline récursives sont traitées dans Delphi?Comment le compilateur Delphi 2009 gère-t-il les méthodes en ligne récursives?
4
A
Répondre
10
Ma conjecture n'est probablement pas puisque inline est seulement une suggestion, mais laisse savoir.
Une simple routine récursive factoriel:
function Factorial(const aNum: cardinal): cardinal;
begin
if aNum > 1 then
Result := Factorial(aNum - 1) * aNum
else
Result := 1;
end;
Voici le démontage de l'appel à elle:
// fact := Factorial(5);
mov eax,$00000005
call Factorial
mov ebx,eax
et le démontage de la routine elle-même:
// 9: begin
push ebx
mov ebx,eax
// 10: if aNum > 1 then
cmp ebx,$01
jbe $0040ab30
// 11: Result := Factorial(aNum - 1) * aNum
mov eax,ebx
dec eax
call Factorial
imul ebx
pop ebx
ret
// 13: Result := 1;
0040ab30: mov eax,$00000001
// 14: end;
pop ebx
ret
maintenant nous le faisons en ligne et voir ce qui est différent je n l'appel:
// 21: fact := Factorial(5);
mov eax,$00000005
call Factorial
mov ebx,eax
Et la routine elle-même:
// 9: begin
push ebx
mov ebx,eax
// 10: if aNum > 1 then
cmp ebx,$01
jbe $0040ab30
// 11: Result := Factorial(aNum - 1) * aNum
mov eax,ebx
dec eax
call Factorial
imul ebx
pop ebx
ret
// 13: Result := 1;
0040ab30: mov eax,$00000001
// 14: end;
pop ebx
ret
Et ils semblent tous deux la même chose pour moi, donc je vais rester avec mon hypothèse de départ et dire qu'ils ne sont pas pris en charge.
BTW: Ceci est en Delphi 2009.
Questions connexes
- 1. "Les bases de Delphi" dans Delphi 2009
- 2. Comment Delphi 2009 convertit les projets Delphi 7 pour les configurations de construction
- 3. DeCAL et Delphi 2009
- 4. Comment réparer Delphi 2009 Data Explorer?
- 5. Comment utiliser les génériques C# dans Delphi 2009/2010?
- 6. Delphi 2009? Ok ou buggy?
- 7. Comment configurer le débogueur JIT dans Delphi 2009?
- 8. Erreur de refactorisation Delphi 2009
- 9. Convertir une chaîne en PAnsiChar en Delphi 2009
- 10. Delphi 2009 problème de compilation de génériques
- 11. Enregistrement des chaînes sur le disque sous Delphi 2009
- 12. FitNesse pour Delphi 2006/Delphi 2007/Delphi 2009
- 13. Delphi 2009 et la mémoire de copie
- 14. lambdas récursives en F #
- 15. PNG dans Delphi 2009 Imagelists et images
- 16. Compilation conditionnelle basée sur une directive de compilateur dans Delphi 2009
- 17. Delphi 2009 Contrôles du ruban - Cadre en verre
- 18. Fonction de commentaire PDF pour delphi 2009
- 19. Utiliser l'option debug dcus dans Delphi 2009?
- 20. Liste générique liée pour Delphi 2009
- 21. Delphi 6 avec RAD Studio 2009
- 22. La communication entre les clients de Delphi 2009
- 23. Delphi 2009 OnKeyDown ne piège que Delphi 2007 ne
- 24. Editeur de connexion DBExpress autonome (Delphi 2009)
- 25. Comment déclarer des variables statiques dans Delphi 2009?
- 26. Conversion TMemoryStream à 'String' dans Delphi 2009
- 27. Conversion de la valeur Integer en AnsiString dans Delphi 2009
- 28. Masquer le formulaire principal dans une application Delphi 2009
- 29. Comment forcer le compilateur Delphi pour afficher tous les conseils et avertissements
- 30. Directive du compilateur Delphi Region - fichiers d'unités rétrocompatibles?
Merci pour la bonne réponse. RE: "En Delphi 2009" je regardais à travers ma référence Object Pascal pour Delphi 7, apparemment en ligne a été un mot-clé compatible avant depuis longtemps, il n'a jamais rien fait à l'époque. –
On dirait que je me souviens d'avoir vu ça il y a un moment aussi. –
"Inline" était la façon dont vous pouviez mettre du code machine brut dans vos fonctions. Maintenant vous utilisez simplement les blocs "asm", et si vous voulez des instructions que le compilateur ne connait pas, insérez les octets avec les instructions DB, DW et DD. –