Delphi动态数组对VarArrayCreate兼容性支持中,非零下限是否可行?

2026-04-28 00:482阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计470个文字,预计阅读时间需要2分钟。

Delphi动态数组对VarArrayCreate兼容性支持中,非零下限是否可行?

我将维护并移植到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.

Delphi动态数组对VarArrayCreate兼容性支持中,非零下限是否可行?

本文共计470个文字,预计阅读时间需要2分钟。

Delphi动态数组对VarArrayCreate兼容性支持中,非零下限是否可行?

我将维护并移植到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.

Delphi动态数组对VarArrayCreate兼容性支持中,非零下限是否可行?