Ada 如何实现'mod'和'range'类型?性能影响是什么?



在Ada中你可以定义所谓的'mod'和'range'类型:

type Unsigned_n is mod 2**n;
type Range_Type is range -5 .. 10;

如何在语言机器级别实现这些?在这些类型上执行操作时,您会遇到什么样的性能损失?

我不清楚你所说的"在语言水平上"是什么意思。在艾达的层面上,他们就是这样!在机器层面,它们按照您的期望实现。

对于模块化类型,如果模数使用2的幂,编译后的代码将使用掩码;否则,会有测试。

type Modular is mod 42;
...
procedure T (M : in out Modular) is
begin
   M := M + 1;
end T;

将(x86_64, -O2)转换为

_foo__t:
LFB2:
        leal    1(%rdi), %eax
        cmpb    $40, %dil
        leal    -41(%rdi), %edx
        cmovg   %edx, %eax
        ret

我现在不写汇编程序了,但看起来还不错(而且,在一种不支持模块化类型的语言中,如果问题需要,你必须自己写类似的东西)。

对于整数类型,实现还是您所期望的那样,当然,为变量赋值涉及约束检查(除非编译器可以证明没有必要)。

但实际上,在大多数情况下,你不需要自己编写这些自增操作;如果需要循环遍历该类型的所有值,可以输入

for J in Modular loop

或者,如果您声明了Arr : array (Range_Type) of Foo;

for J in Arr'Range loop

,不需要检查J的有效性,因此没有性能损失。

总是可以抑制约束检查(在GNAT中,-gnatp抑制所有检查);但这有点像你一离开车道就把安全带解开!

最新更新