2

我对 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;

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

4

1 回答 1

5

根据 Ada 语言标准,这两种形式的代码没有一般的理由应该具有不同的性能。这一切都取决于目标机器和正在使用的编译器。根据过程中的其余代码,一些编译器甚至可以完全优化掉Another_Bar变量。

但是,存在语义差异,如果 和 的子类型不同,这可能很重要Bar——Another_Bar例如,如果Another_Bar声明为Positive而不是Integer. 也就是说,在第一种形式中,任何由初始化引发的异常Another_Bar(例如,因为Bar具有负值)都不会由过程本身中可能的异常处理程序处理,而是传播给调用者。在第二种形式中, where 在Another_Bar之后分配begin,来自该分配的异常可以由过程自己的异常处理程序处理。

于 2022-01-21T17:18:02.323 回答