Ada:声明和赋值开销

Ada: Declaration & assignment overhead

我对 Ada 过程中的初始化很好奇: 假设我有以下程序:

procedure Foo (Bar : Integer) is
    Another_Bar : Integer := Bar;
begin
    ...
end Foo;

分配给 Another_Bar 的开销是否应该与

相同
procedure Foo2 (Bar : Integer) is
    Another_Bar : Integer;
begin
    Another_Bar := Bar;
    ...
end Foo;

我的问题本质上是两个赋值是否生成相同的汇编指令并因此速度相等? (没有详细说明目标机器)

基于 Ada 语言标准,这两种形式的代码应该具有不同的性能没有普遍原因。这完全取决于目标机器和所使用的编译器。根据过程中的其余代码,某些编译器甚至可以完全优化 Another_Bar 变量。

但是,存在语义差异,如果 BarAnother_Bar 的子类型不同,这可能很重要——例如,如果 Another_Bar 被声明为 Positive 而不是 Integer。即,在第一种形式中,由 Another_Bar 的初始化引发的任何异常(例如,因为 Bar 具有负值)不会由过程本身中可能的异常处理程序处理,但会传播到呼叫者。在第二种形式中,Another_Barbegin 之后赋值,来自该赋值的异常可以由过程自己的异常处理程序处理。