Performance Ada如何实现';mod';和';范围';类型?性能影响是什么?

Performance Ada如何实现';mod';和';范围';类型?性能影响是什么?,performance,types,programming-languages,ada,Performance,Types,Programming Languages,Ada,在Ada中,您可以定义所谓的“”和“”类型: 这些是如何在语言机器级别实现的?在这些类型上执行操作时,您会受到什么样的性能损失?不清楚“在语言级别”是什么意思。在Ada级别,他们就是这样!在机器层面上,它们是按照您期望的方式实现的 对于模块化类型,如果对模使用2的幂,则编译代码使用掩码;否则,将进行测试 type Modular is mod 42; ... procedure T (M : in out Modular) is begin M := M + 1; end T; 将(x8

在Ada中,您可以定义所谓的“”和“”类型:


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

不清楚“在语言级别”是什么意思。在Ada级别,他们就是这样!在机器层面上,它们是按照您期望的方式实现的

对于模块化类型,如果对模使用2的幂,则编译代码使用掩码;否则,将进行测试

type Modular is mod 42;
...
procedure T (M : in out Modular) is
begin
   M := M + 1;
end T;
将(x86_64,-O2)转换为

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

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

但实际上,对于大多数用途,您并不是自己编写这些增量操作;如果需要循环该类型的所有值,可以说

for J in Modular loop
或者,如果您已经声明了Foo的
Arr:array(Range\u Type),

for J in Arr'Range loop
而且无需检查
J
的有效性,因此不会造成性能损失


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

谢谢大家!!是的,“机器级别”是我应该说的——我会修正我的问题。事实上,如果模块类型恰好适合机器寄存器,编译器难道不会顺其自然地处理包装情况吗(并且忽略任何讨厌的溢出或进位标志)?在这种情况下,模块化整数将更有效,因为不需要约束检查。
for J in Modular loop
for J in Arr'Range loop