Delphi动态数组对VarArrayCreate兼容性支持中,非零下限是否可行?
- 内容介绍
- 文章标签
- 相关推荐
本文共计470个文字,预计阅读时间需要2分钟。
我将维护并移植到Delphi XE2一个非同寻常的Delphi代码,这些代码充满了+VarArrayCreate+构造的伪动态数组,其下限不为零。使用Variant类型的一个缺点是:与原生数组相比,它慢得多(尤其是在代码执行大量复杂数学运算时)。
我将维护并移植到Delphi XE2一堆非常旧的Delphi代码,这些代码充满了 VarArrayCreate个构造,伪造的动态数组的下限不为零.使用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.
本文共计470个文字,预计阅读时间需要2分钟。
我将维护并移植到Delphi XE2一个非同寻常的Delphi代码,这些代码充满了+VarArrayCreate+构造的伪动态数组,其下限不为零。使用Variant类型的一个缺点是:与原生数组相比,它慢得多(尤其是在代码执行大量复杂数学运算时)。
我将维护并移植到Delphi XE2一堆非常旧的Delphi代码,这些代码充满了 VarArrayCreate个构造,伪造的动态数组的下限不为零.使用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.

