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.
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. –