use*_*012 4 arrays delphi procedure
我有一个我不明白的问题:
procedure TMain.THREAD_SYNC(
AProgressBar: TProgressBar;
ARemoteData: array of RemoteDATA;
ALocalData : array of LocalDATA;
Number : integer;
AInfo : TEdit);
Run Code Online (Sandbox Code Playgroud)
如果我为它指定"较小的数组",以下过程可以完美地工作
THREAD_SYNC(Remote,Local,0,Edit1)
Run Code Online (Sandbox Code Playgroud)
当我尝试为它分配一个更大的数组超过30.000条记录然后我得到一个Stack Overflow错误,所以我尝试了googled ...我发现了一些关于使用的东西const所以我把我的程序改为:
procedure TMain.THREAD_SYNC(
AProgressBar: TProgressBar;
ARemoteData: array of RemoteDATA;
const ALocalData : array of LocalDATA;
Number : integer;
AInfo : TEdit);
Run Code Online (Sandbox Code Playgroud)
现在它有效,我的问题是我不明白为什么?
没有const什么区别?
这些数组按值传递,这意味着它们被复制到堆栈并以这种方式传递.因此堆栈溢出错误.
通过创建数组参数解决了该问题const.在那种情况下,数组通过引用而不是值传递.换句话说,传递单个指针.
通常,当传递(可能)大型结构(如数组或记录)时,应始终通过引用传递它们; 使用const,如果该方法接收它们不改变数据,并且使用var如果接收器.这样做的另一个好处是您的代码变得更快,因为不需要复制数据.
您可能应该改变您的方法:
procedure TMain.THREAD_SYNC(
AProgressBar: TProgressBar;
const ARemoteData: array of RemoteDATA;
const ALocalData : array of LocalDATA;
Number : integer;
AInfo : TEdit);
Run Code Online (Sandbox Code Playgroud)
没有必要使用const TProgressBar或者TEdit,这些类和类存储在堆上,只有堆栈上的引用.
| 归档时间: |
|
| 查看次数: |
125 次 |
| 最近记录: |