【问题标题】:What happens in background when passing parameters as variable in a function在函数中将参数作为变量传递时在后台会发生什么
【发布时间】:2016-11-22 21:41:44
【问题描述】:

我在某些地方读到了一些关于这方面的理论资料,但我还不明白......

假设我有这个函数和程序:

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 只是改变了变量的内容,而不是在内存中重新创建它?

谢谢!

【问题讨论】:

  • 我完全不明白这个问题。每次调用它声明的函数时,都会创建和销毁一个局部变量。
  • 感谢@DavidHeffernan!但是,有没有办法避免在每次调用函数时创建变量?我的意思是,ProcessVars 和 ProcessVarsX 只是改变变量内容,而不在内存中重新创建它?
  • 仔细阅读大卫的评论。 “它声明的函数”在您的代码中是“DoSomething”,而不是“Process..”。
  • 好吧,让我更好地理解...所以变量 var1、var2 和 var3 是由“DoSomething”过程在内存中创建的,而其他函数 ProcessVars 和 ProcessVarsX 只使用相同的内存分配空间?我是对的?
  • 由于它们是在ProcessVars中声明的var,所以它们是通过引用传递的。

标签: function delphi parameters


【解决方案1】:

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

DoSomething() 调用ProcessVars() 时,它会复制 x,因为x 正在按值传递 strong>,但它会传递var1var2var3内存地址,因为它们是由 var 引用传递的。

ProcessVars() 将其param1param2param3 参数传递给各种ProcessVars...() 函数时,它们再次被var 引用 传递,所以只有内存地址正在被传递。物理变量仍然仅驻留在DoSomething() 中,它们不会被复制到内存中。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多