我将维护并移植到Delphi XE2一堆非常旧的Delphi代码,这些代码充满了 VarArrayCreate个构造,伪造的动态数组的下限不为零. 使用Variant类型的缺点是: 比原生数组慢很多(代码执行大量复杂的财
使用Variant类型的缺点是:
>比原生数组慢很多(代码执行大量复杂的财务计算,因此速度很重要)
>不安全(特别是在偶然使用错误的var …常量时,Variant系统开始进行不需要的转换或舍入)
如果我能使用dynamic arrays,两者都可能没有实际意义.
变体数组的好处是它们可以具有非零下界.
我记得的是动态数组总是以零的下限开始.
这仍然是真的吗?换句话说:动态数组是否可以以不同于零的边界开始?
作为示例,针对特定情况的前/后示例(单维,但代码充满了多维数组,除了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;
CalculateItem函数返回Double.界限从1到aSV.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;动态数组的下限始终为0.因此,对于所有动态数组,低(A)等于0.这对于空动态阵列甚至是零也是如此.
从documentation:
Dynamic arrays are always integer-indexed, always starting from 0.