3

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

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

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

4

1 回答 1

8

目前尚不清楚您所说的“在语言层面”是什么意思。在 Ada 级别,他们就是!在机器级别,它们按照您的期望实现。

对于模块化类型,如果您使用 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抑制所有检查);但这有点像一离开车道就解安全带!

于 2013-04-23T07:12:11.103 回答