什么时候将长度获取器移出循环才有意义



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

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();

最新更新