我这里有一个我不明白的问题:
procedure TMain.THREAD_SYNC(
AProgressBar: TProgressBar;
ARemoteData: array of RemoteDATA;
ALocalData : array of LocalDATA;
Number : integer;
AInfo : TEdit);
如果我像这样分配“较小的数组”,则下面的过程可以很好地工作
THREAD_SYNC(Remote,Local,0,Edit1)
当我尝试为其分配更大的数组时,记录超过30.000条记录,然后出现堆栈溢出错误,因此我尝试并用google搜索...,我发现了一些有关使用const
的信息,因此将过程更改为:
procedure TMain.THREAD_SYNC(
AProgressBar: TProgressBar;
ARemoteData: array of RemoteDATA;
const ALocalData : array of LocalDATA;
Number : integer;
AInfo : TEdit);
现在可以了,我的问题是我不明白为什么?
没有const
有什么区别?
答案 0 :(得分:6)
这些数组按值传递,这意味着它们被复制到堆栈上并以这种方式传递。因此,堆栈溢出错误。
通过设置数组参数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,它们是类,并且类存储在堆中,而堆栈中只有一个引用。