在 Ada 中,您可以定义所谓的 ' mod ' 和 ' range ' 类型:
type Unsigned_n is mod 2**n;
type Range_Type is range -5 .. 10;
这些是如何在语言机器级别实现的?在对这些类型执行操作时,您会遇到什么样的性能损失?
目前尚不清楚您所说的“在语言层面”是什么意思。在 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
抑制所有检查);但这有点像一离开车道就解安全带!