调用重载函数是否有任何额外的运行时开销?

(我专门为 Delphi 问这个问题,以防所有编译语言的答案都不同)

我认为这不应该在编译时解决,但是您永远无法确定可以吗?

最佳答案

当然可以确定,因为它是documented。是编译器在编译时解决它,因此在Delphi中调用重载函数没有额外的开销。

[编辑]

我为您做了一个小测试:

var
  j: Integer;
  st: string;

procedure DoNothing(i: Integer); overload;
begin
  j := i;
end;

procedure DoNothing(s: string); overload;
begin
  st := s;
end;

procedure DoNothingI(i: integer);
begin
  j := i;
end;

procedure TForm2.Button1Click(Sender: TObject);
const
  MaxIterations = 10000000;
var
  StartTick, EndTick: Cardinal;
  I: Integer;
begin
  StartTick := GetTickCount;
  for I := 0 to MaxIterations - 1 do
    DoNothing(I);
  EndTick := GetTickCount;
  Label1.Caption := Format('Overlaod ellapsed ticks: %d [j:%d]', [EndTick - StartTick, j]);
  StartTick := GetTickCount;
  for I := 0 to MaxIterations - 1 do
    DoNothingI(I);
  EndTick := GetTickCount;
  Label1.Caption := Format('%s'#13'Normal ellapsed ticks: %d [j:%d]', [Label1.Caption, EndTick - StartTick, j]);
end;

结果:在我的开发机上,几乎所有时间都为31个滴答声(毫秒),有时过载仅需要16个滴答声。

10-08 12:46