动态数组是否支持非零下限(对于VarArrayCreate兼容性)?

Jer*_*ers 4 delphi variant dynamic-arrays delphi-xe2

我正在维护并向Delphi XE2移植一堆非常旧的Delphi代码,这些代码充满了VarArrayCreate构造,伪造的动态数组的下限不为零.

使用Variant类型的缺点是:

  • 比原生数组慢得多(代码执行了大量复杂的财务计算,因此速度很重要)
  • 不安全(特别是在使用错误的var...常量时,Variant系统开始进行不需要的转换或舍入)

如果我可以使用动态数组,两者都可能没有实际意义.

变体数组的好处是它们可以具有非零下界.

我记得的是动态数组总是以零的下限开始.

这仍然是真的吗?换句话说:动态数组是否可以以不同于零的边界开始

作为示例,针对特定情况的前/后示例(单维,但代码充满了多维数组,除了varDouble之外,代码还使用TVarData允许使用的各种其他varXXX数据类型):

function CalculateVector(aSV: TStrings): Variant;
var
  I: Integer;
begin
  Result := VarArrayCreate([1,aSV.Count-1],varDouble);
  for I := 1 to aSV.Count-1 do
    Result[I] := CalculateItem(aSV, I);
end;
Run Code Online (Sandbox Code Playgroud)

CalculateItem函数返回Double.边界是从1aSV.Count-1.

当前替换是这样的,交换Result的空间第零元素以改进编译时间检查:

type
  TVector = array of Double;
function CalculateVector(aSV: TStrings): TVector;
var
  I: Integer;
begin
  SetLength(Result, aSV.Count); // lower bound is zero, we start at 1 so we ignore the zeroth element
  for I := 1 to aSV.Count-1 do
    Result[I] := CalculateItem(aSV, I);
end;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

动态数组总是有一个下限0.因此,low(A)等于0所有动态数组.对于空动态数组,即使是这样也是如此nil.

文档:

动态数组始终是整数索引,始终从0开始.