Delphi 复制开放阵列的推荐方法

Delphi 复制开放阵列的推荐方法,delphi,Delphi,除了使用for循环外,建议使用什么方法将一个开放数组上的内容尽快复制到另一个开放数组?在这种情况下,数组是一个简单的双精度数组,您可以假设源数组和目标数组的大小相同 myValues : array of double; 我看到了这个问题的答案,它使用了Move。这是一种合理的方法还是有其他选择?这样的复制将经常进行,因此我正在寻找最有效的方法。尽管您询问从一个开放阵列复制到另一个开放阵列的问题,但我不知道您是否真的希望这样做。我怀疑您实际上使用的术语相当松散。您链接到的问题涉及将开放数组复制

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

myValues : array of double;

我看到了这个问题的答案,它使用了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;
类型
TArray=class(Generics.Collections.TArray)
公众的
类函数副本(常量源:T的数组;索引,计数:整数):TArray;超载;静止的
类函数副本(常量源:T的数组):TArray;超载;静止的
结束;
类函数TArray.Copy(常量源:T的数组;索引,计数:整数):TArray;
变量
i:整数;
开始
设置长度(结果、计数);
对于i:=0到高(结果)不开始
结果[i]:=源[i+索引];
结束;
结束;
类函数TArray.Copy(常量源:T的数组):TArray;
变量
i:整数;
开始
设置长度(结果、长度(源));
对于i:=0到高(结果)不开始
结果[i]:=来源[i];
结束;
结束;

该类型有很多其他方法,为了简洁起见,我省略了这些方法。

有趣的是,你应该问。在我发布了这个问题之后,我想,我知道会发生什么,他们会问‘为什么我需要复制阵列?’,所以我进一步思考了这个问题,意识到我根本不需要复制阵列。然而,我认为这个问题仍然是一个有待解决的问题,因为在其他情况下,复制阵列是一种合法的操作。因此,我觉得给出的答案将对其他人有用,即使这个问题现在对我来说有些多余。好的。显然,什么都不做总是更快@Rody,如果您将double的
数组定义为一个类型,并为该类型编写一个复制方法,那么使用
Move
将是类型安全且(最)高效的。