dig*_*hog 2 initialization ada elaboration
我对 Ada 程序中的初始化很好奇:假设我有以下程序:
procedure Foo (Bar : Integer) is
Another_Bar : Integer := Bar;
begin
...
end Foo;
Run Code Online (Sandbox Code Playgroud)
分配是否应该Another_Bar具有相同的开销
procedure Foo2 (Bar : Integer) is
Another_Bar : Integer;
begin
Another_Bar := Bar;
...
end Foo;
Run Code Online (Sandbox Code Playgroud)
我的问题本质上是两个分配是否生成相同的汇编指令,因此速度相同?(没有详细说明目标机器)
根据 Ada 语言标准,这两种形式的代码应该具有不同的性能并没有普遍的理由。这完全取决于目标机器和所使用的编译器。根据过程中的其余代码,某些编译器甚至可以完全优化掉该Another_Bar变量。
然而,存在语义差异,如果Bar和 的子类型Another_Bar不同,这可能很重要——例如,如果Another_Bar被声明Positive为而不是Integer。也就是说,在第一种形式中,初始化引发的任何异常Another_Bar(例如,因为Bar具有负值)都不会由过程本身中可能的异常处理程序处理,而是传播到调用者。在第二种形式中,whereAnother_Bar在 后赋值begin,来自该赋值的异常可以由过程自己的异常处理程序处理。