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