请考虑以下内容(不是任何特定语言):
for (i=0; i<list.length(); i++) { ... }
有些人喜欢将其重写为:
int len = list.length()
for (i=0; i<len; i++) { ... }
如果通过 list.length()
获得长度不是 O(1),这是有意义的。但我看不出有任何理由会这样。无论数据类型如何,在某处添加长度字段并在大小更改时更新它应该是微不足道的。
是否有获取或更新长度不是 O(1) 的常见数据类型?还是有人想这样做还有其他原因?
在这种情况下,您直接访问属性,而不是使用 getter(函数调用)。这可能总是比方法调用快。即使有一个方法调用,许多语言也足够聪明,可以对其进行优化。
这是一个微优化,但是一个有效的优化(并不意味着应该这样做,而是它可以提高速度 - 很可能是不明显的加速)。这有效的原因是因为别名。
length
可以在循环中修改,非侵入式编译器可能无法判断它是否被修改。 因此,它必须每次都读取值,而不是在循环之前访问一次。
如果通过方法调用检索长度,则差异可能会更加明显 - 就像您在C++中所做的那样:
int len = vect.size();