0

考虑以下内容(不是任何特定语言):

for (i=0; i<list.length(); i++) { ... }

有些人喜欢将其重写为:

int len = list.length()
for (i=0; i<len; i++) { ... }

list.length()如果获取长度不是 O(1),这将是有意义的。但我看不出有任何理由会出现这种情况。无论数据类型如何,在某处添加一个长度字段并在大小发生变化时更新它应该是微不足道的。

是否存在获取或更新长度不是 O(1) 的常见数据类型?或者还有其他原因为什么有人想要这样做?

4

2 回答 2

0

这是一种微优化,但却是有效的(不是暗示应该这样做,而是它可以提高速度——最有可能是不明显的加速)。这是有效的原因是因为aliasing

length可以在循环内修改,非侵入式编译器可能无法判断它是否被修改。因此,它每次都必须读取该值,而不是在循环之前访问一次。

如果通过方法调用检索长度,则差异可能会更加明显 - 就像您在 C++ 中所做的那样:

int len = vect.size();
于 2012-10-12T23:40:31.077 回答
0

在这种情况下,您是直接访问属性,而不是使用 getter(函数调用)。这可能总是比方法调用快。即使有方法调用,许多语言也足够聪明,可以对其进行优化。

于 2012-10-12T23:40:53.713 回答