在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
抑制所有检查);但这有点像你一离开车道就把安全带解开!