Когда Delphi соблюдает `inline`, а когда нет?

Я пытался оптимизировать фрагмент кода со следующей конструкцией:

while (i > 0) do begin
  Dec(i);

Это выглядит неэффективно, поэтому я попытался сделать следующее:

while (Dec(i) >= 0) do begin

Это не работает, потому что Dec является процедура, а не функция.

Так что я переписываю ее так:

procedure Withloop;
var
  ....
  function Decr(var a: integer): integer; inline;
  begin
    Dec(a);
    Result:= a;
  end;

...
  while (Decr(i) >= 0) do begin

Но это компилируется в:

SDIMAIN.pas.448: while (Decr(i) >= 0) do begin
00468EE5 8BC4             mov eax,esp
00468EE7 E8D0FEFFFF       call Decr          <<--- A call??
00468EEC 85C0             test eax,eax
00468EEE 0F8D12FFFFFF     jnl $00468e06
00468EF4 EB01             jmp $00468ef7

Однако в другой части программы функция просто встраивается.
Какое практическое правило (или жесткое правило) я могу использовать, чтобы знать, что Delphi будет соблюдать директиву inline ?

5
задан Johan - reinstate Monica 19 June 2011 в 10:05
поделиться