2014-10-06 57 views
0

以下代码中变量s的总跨度是多少?如何计算一个对象的总跨度?

 
1: procedure sum(array: integer_array) 
2:  var s: integer; 
3: begin 
4:  s := 0; 
5:  for i in array'range loop 
6:   s := s + array(i); 
7:  end loop; 
8: end; 

我看到它的方式有两种可能的解释:

  1. 在第1行声明时计数作为基准,然后total_span(S) = 1
  2. 行1中的声明确实是算作参考,然后total_span(s) = 3

这里有两个共同的定义,以帮助澄清一个问题:

  • 变量的总跨度是在它直到它它引用的最后声明中引用的第一个语句之间的代码行数。 (这是麦康奈尔在代码中调用生存时间齐全,他用包容性的限制等生存时间的微小差别= 总跨度 + 2)
  • 变量的平均跨度是平均数向可变

注意,这些概念不与存储器allocaction,范围或其中变量可以在代码中使用的相关的两个连续的引用之间的代码行。这些指标是指在代码中使用变量的实际。

回答

1

我认为这是声明不算,但初始化计数。

使用您的示例,第2行中的声明不计数,因为该变量在第4行之前没有被初始化,这意味着在此之前它不能被计算为“live”。

在某些情况下,声明构成隐式初始化(​​例如,具有默认构造函数的类型的对象的C++声明)。在这些情况下,声明和初始化发生在同一行,这意味着声明的行应该被视为变量的第一次使用。

+0

我在想这个,你认为可以说范围从变量初始化的地方开始,并且与算法相关的值被初始化了吗?在我使用的语言中,变量's'将在第2行获得默认值-INF,但与算法真正相关的初始化是第4行中的初始值。 – rick 2014-10-06 16:42:44

+1

@rick如果语言让您无法选择在第一次赋值的地方声明变量(即第4行),那么我同意你的看法:忽略's'已被初始化为'-INF'的事实是合理的。但是,如果声明和第一次有意义的初始化是由选择分隔的(在经验丰富的C到Java转换中常见错误,当所有变量都声明在函数的顶部),那么跨度应该从初始化开始,因为该指标应该鼓励缩短跨度。 – dasblinkenlight 2014-10-06 16:53:56

0

只是在这里回答这个问题,也许这会有帮助:这里's'的跨度是2,平均跨度是2。