【问题标题】:How best to add records to TArray如何最好地将记录添加到 TArray
【发布时间】:2018-08-15 01:13:21
【问题描述】:

在编写测试程序时,我遇到了这个示例代码:

var MyData: TArray<TDataRec>;

procedure AppendData(AItem: TOrderByCustomer);
var i: Integer;
  tmp: TArray<TOrderByCustomer>;
begin
  SetLength(tmp, Length(MyData)+1);
  for i:=0 to High(MyData) do
    tmp[i]:=MyData[i];

  tmp[Length(tmp)-1]:=AItem;
  MyData:=tmp;
end;

过去我只是简单地使用 SetLength() 来更改实际数组的长度。为什么这个示例的作者创建了一个临时数组,然后将所有值分配给它并将其复制回原始数组?这是有充分的理由吗,还是他只是怪怪的?

【问题讨论】:

  • 他一直很奇怪。
  • 确实,作者可能不知道这些东西到底是怎么工作的。
  • 如果您要向数组中添加大量项目,则应该使用更灵活的容器,例如 TList&lt;T&gt;
  • FWIW,这行不通,除非 TDataRec 和 TOrderByCustomer 属于同一类型。我认为这是一个捏造的例子,而不是真实的代码?

标签: delphi


【解决方案1】:

这段代码没有充分的理由。它引入了不必要的复制的潜在开销。函数应该这样写:

procedure AppendData(const AItem: TOrderByCustomer);
var
  N: Integer;
begin
  N := Length(MyData);
  SetLength(MyData, N + 1);
  MyData[N] := AItem;
end;

【讨论】:

  • 还有MyData := MyData + [AItem];Insert,因为XE7
  • 请注意:如果您反复执行此操作并使用多个值,则可能会出现内存碎片和持续减速的风险。如果可能,以更大的块添加长度并跟踪有多少元素是有效的。见我的博客:rvelthuis.blogspot.com/2004
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多