Erfüllen "What's wrong with using inline functions" und "Can a recursive function be inline" Delphi-Inline-Funktionen? Weiß jemand darüber hinaus, wie rekursive Inline-Funktionen in Delphi behandelt werden?Wie behandelt der Delphi 2009-Compiler rekursive Inline-Methoden?
4
A
Antwort
10
Meine Vermutung ist wahrscheinlich nicht, da Inline nur ein Vorschlag ist, aber lasst uns herausfinden.
Eine einfache rekursive faktorielles Routine:
// fact := Factorial(5);
mov eax,$00000005
call Factorial
mov ebx,eax
Und die Demontage der Routine selbst: Jetzt
// 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
function Factorial(const aNum: cardinal): cardinal;
begin
if aNum > 1 then
Result := Factorial(aNum - 1) * aNum
else
Result := 1;
end;
Hier ist die Demontage des Anrufs ist Wir machen es Inline und sehen, was ist anders ich n der Anruf:
// 21: fact := Factorial(5);
mov eax,$00000005
call Factorial
mov ebx,eax
Und die Routine selbst:
// 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
Und beide scheinen gleich zu mir, so werde ich mit meiner ursprünglichen Hypothese bleiben und sagen, dass sie nicht unterstützt werden.
BTW: Das ist in Delphi 2009
Vielen Dank für die gute Antwort. RE: "In Delphi 2009" Ich habe meine Object Pascal-Referenz für Delphi 7 durchgesehen, anscheinend war Inline schon lange ein vorwärtskompatibles Schlüsselwort, es hat damals nie etwas getan. –
Scheint so, als ob ich mich daran erinnere, es vor einer Weile gesehen zu haben. –
"Inline" war früher, wie man rohen Maschinencode in seine Funktionen einbauen konnte. Jetzt verwenden Sie einfach "asm" -Blöcke, und wenn Sie Anweisungen brauchen, die der Compiler nicht kennt, fügen Sie die Bytes mit DB-, DW- und DD-Anweisungen ein. –