Delphi 程序数组参数混淆
Delphi Procedure Array Parameter confusion
这里有一个我不明白的问题:
procedure TMain.THREAD_SYNC(
AProgressBar: TProgressBar;
ARemoteData: array of RemoteDATA;
ALocalData : array of LocalDATA;
Number : integer;
AInfo : TEdit);
如果我像这样"smaller arrays"分配给它"smaller arrays",下面的过程将完美运行
THREAD_SYNC(Remote,Local,0,Edit1)
当我尝试为它分配一个包含超过 30.000 条记录的更大数组时,我收到 Stack Overflow 错误,所以我尝试并用谷歌搜索......我发现了一些关于使用 const
的东西,所以我改变了我的程序:
procedure TMain.THREAD_SYNC(
AProgressBar: TProgressBar;
ARemoteData: array of RemoteDATA;
const ALocalData : array of LocalDATA;
Number : integer;
AInfo : TEdit);
现在可以用了,我的问题是我不明白为什么?
没有const
有什么区别?
这些数组是按值传递的,这意味着它们被复制到堆栈上并以这种方式传递。因此堆栈溢出错误。
问题已通过制作数组参数const
解决。在那种情况下,数组是通过引用而不是值传递的。换句话说,传递了一个指针。
一般来说,在传递(可能)大型结构如数组或记录时,您应该始终通过引用传递它们;如果接收它们的方法不改变数据,则使用 const
,如果接收者改变,则使用 var
。这样做的额外好处是您的代码变得更快,因为不需要复制数据。
你应该像这样改变你的方法:
procedure TMain.THREAD_SYNC(
AProgressBar: TProgressBar;
const ARemoteData: array of RemoteDATA;
const ALocalData : array of LocalDATA;
Number : integer;
AInfo : TEdit);
TProgressBar
或TEdit
不需要使用const,这些类和类都存储在堆上,仅在堆栈上有引用.
这里有一个我不明白的问题:
procedure TMain.THREAD_SYNC(
AProgressBar: TProgressBar;
ARemoteData: array of RemoteDATA;
ALocalData : array of LocalDATA;
Number : integer;
AInfo : TEdit);
如果我像这样"smaller arrays"分配给它"smaller arrays",下面的过程将完美运行
THREAD_SYNC(Remote,Local,0,Edit1)
当我尝试为它分配一个包含超过 30.000 条记录的更大数组时,我收到 Stack Overflow 错误,所以我尝试并用谷歌搜索......我发现了一些关于使用 const
的东西,所以我改变了我的程序:
procedure TMain.THREAD_SYNC(
AProgressBar: TProgressBar;
ARemoteData: array of RemoteDATA;
const ALocalData : array of LocalDATA;
Number : integer;
AInfo : TEdit);
现在可以用了,我的问题是我不明白为什么?
没有const
有什么区别?
这些数组是按值传递的,这意味着它们被复制到堆栈上并以这种方式传递。因此堆栈溢出错误。
问题已通过制作数组参数const
解决。在那种情况下,数组是通过引用而不是值传递的。换句话说,传递了一个指针。
一般来说,在传递(可能)大型结构如数组或记录时,您应该始终通过引用传递它们;如果接收它们的方法不改变数据,则使用 const
,如果接收者改变,则使用 var
。这样做的额外好处是您的代码变得更快,因为不需要复制数据。
你应该像这样改变你的方法:
procedure TMain.THREAD_SYNC(
AProgressBar: TProgressBar;
const ARemoteData: array of RemoteDATA;
const ALocalData : array of LocalDATA;
Number : integer;
AInfo : TEdit);
TProgressBar
或TEdit
不需要使用const,这些类和类都存储在堆上,仅在堆栈上有引用.