bjz*_*bjz 3 performance types programming-languages ada
在Ada中,您可以定义所谓的" mod "和" range "类型:
type Unsigned_n is mod 2**n;
type Range_Type is range -5 .. 10;
Run Code Online (Sandbox Code Playgroud)
这些是如何在语言机器级别实现的?在对这些类型执行操作时,您会遇到什么样的性能损失?
目前尚不清楚你在"语言层面"是什么意思.在Ada级别,他们就是这样!在机器级别,它们实现了您的期望.
对于模块类型,如果使用2的幂作为模数,则编译的代码使用掩码; 否则,会有测试.
type Modular is mod 42;
...
procedure T (M : in out Modular) is
begin
M := M + 1;
end T;
Run Code Online (Sandbox Code Playgroud)
将(x86_64,-O2)翻译为
_foo__t:
LFB2:
leal 1(%rdi), %eax
cmpb $40, %dil
leal -41(%rdi), %edx
cmovg %edx, %eax
ret
Run Code Online (Sandbox Code Playgroud)
我现在不编写汇编程序,但这看起来并不太糟糕(并且,在一种不支持模块类型的语言中,如果问题需要,你必须自己编写类似的东西).
对于整数类型,实现再次如您所期望的那样,当然除了为变量赋值包含约束检查(除非编译器可以证明不需要).
但实际上,对于大多数用途,您不会自己编写这些增量操作; 如果你需要循环遍历所有类型的值,你可以说
for J in Modular loop
Run Code Online (Sandbox Code Playgroud)
或者,如果你已经宣布Arr : array (Range_Type) of Foo;,
for J in Arr'Range loop
Run Code Online (Sandbox Code Playgroud)
而且没有必要检查其有效性J,因此没有性能损失.
总是可以抑制约束检查(在GNAT中,-gnatp禁止所有检查); 但这有点像你离开车道后系好安全带!