建议的方法来复制打开的数组

时间:2014-02-08 18:12:03

标签: delphi

除了使用for循环之外,建议的方法是尽可能快地将一个打开的数组上的内容复制到另一个打开的数组?在这种情况下,数组是一个简单的双精度数组,您可以假设源数组和目标数组具有相同的大小。

myValues : array of double;

我看到了使用Move的问题How to copy array?的答案。这是一种合理的方法吗?还是有替代方案?这种复制将经常进行,所以我正在寻找最有效的方法。

1 个答案:

答案 0 :(得分:1)

虽然您要求从一个开放阵列复制到另一个阵列,但我想知道这是不是您真正想做的事情。我怀疑你实际上是在松散地使用术语。您链接到的问题包括将打开的数组复制到动态数组。我认为这就是你真正想做的事情。

如果你知道基类型是不受管理的,并且原始内存副本是有效的,那么你将很难超越Move的性能。但只考虑Move,如果您的代码部分的性能至关重要。除非有令人信服的理由放弃类型系统的安全性,否则最好避免使用无类型操作。

对于通用数组副本,我使用以下类型:

type
  TArray = class(Generics.Collections.TArray)
  public
    class function Copy<T>(const Source: array of T; Index, Count: Integer): TArray<T>; overload; static;
    class function Copy<T>(const Source: array of T): TArray<T>; overload; static;
  end;

class function TArray.Copy<T>(const Source: array of T; Index, Count: Integer): TArray<T>;
var
  i: Integer;
begin
  SetLength(Result, Count);
  for i := 0 to high(Result) do begin
    Result[i] := Source[i+Index];
  end;
end;

class function TArray.Copy<T>(const Source: array of T): TArray<T>;
var
  i: Integer;
begin
  SetLength(Result, Length(Source));
  for i := 0 to high(Result) do begin
    Result[i] := Source[i];
  end;
end;

为简洁起见,该类型有很多其他方法。