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);

TProgressBarTEdit不需要使用const,这些类和类都存储在堆上,仅在堆栈上有引用.