在函数中将参数作为变量传递时,后台会发生什么

时间:2016-11-22 21:41:44

标签: function delphi parameters

我在某些地方提到了一些有关此事的理论信息,但我还不明白......

让我们知道我有这个功能和程序:

function ProcessVars1(var param1: type1; var param2: type2; var param3: type3): Boolean;
function ProcessVars2(var param1: type1; var param2: type2; var param3: type3): Boolean;
function ProcessVars3(var param1: type1; var param2: type2; var param3: type3): Boolean;
function ProcessVarsX(var param1: type1; var param2: type2; var param3: type3): Boolean;

function ProcessVars(const x: Integer; var param1: type1; var param2: type2; var param3: type3): Boolean;
var
  Res: Boolean;
begin
  case x of
    1: Res := ProcessVars1(param1, param2, param3);
    2: Res := ProcessVars2(param1, param2, param3);
    3: Res := ProcessVars3(param1, param2, param3);
    ...
  end;
  Result := Res;
end;

procedure DoSomething;
var
  x: integer;
  var1: type1;
  var2: type2;
  var3: type3;
begin
  // Determine X
  x := 1;  
  if ProcessVars(x, var1, var2, var3) then
  begin
    // Use var1, var2 and var3
  end;
end;

我想知道的是,当调用“DoSomething”程序时,变量var1,var2和var3在内存中只创建了一次,还是3次?

有没有办法避免每次调用函数时都创建变量?我的意思是,ProcessVars和ProcessVarsX只更改变量内容,而不在内存中再创建它?

谢谢!

1 个答案:

答案 0 :(得分:7)

DoSomething()声明了四个局部变量 - xvar1var2var3。每次调用DoSomething()时都会创建这些变量,并在DoSomething()退出时消失。

DoSomething()调用ProcessVars()时,由于x正在x,它会对var1进行复制通过值传递,但它传递了var2var3var内存地址,因为它们被 ProcessVars()参考

param1将其param2param3ProcessVars...()参数传递给各种var函数时, {再次传递它们{1}}引用,因此只传递内存地址。物理变量仅驻留在DoSomething()中,它们不会被复制到内存中。