我正在为图形编写一个小型的专用c99库,我经常得到以下形式的循环:

for(int i = 0; i < graph->nvertices; ++i) {
  // ...
}

我想知道这是不是一个好的做法,尤其是在跳跳循环的情况下。起初,我认为编译器足够聪明,只看一次“graph->nvertices”,而不是每次迭代都看一次,但似乎不可能,因为graph->nvertices可能在循环中发生变化。IS更聪明,写得更快:
const int N = graph->nvertices;
for(int i = 0; i < N; ++i) {
  // ...
}

它看起来更快,因为它不需要多次查看指针,但它确实需要创建一个新变量。
注意:我想这是一种很好的情况,如果有人有一个很好的引用,我愿意接受建议,可以读一点汇编代码来看看编译器实际在做什么。

最佳答案

尝试使用更高的优化设置,一些编译器应该能够为您优化。也可以反向迭代,只使用表达式初始化计数器:

for (int i = graph->nvertices; i >= 0; --i)
  ..

但是,您将对缓存性能造成严重破坏。我认为您建议的方法是最直接的,这使编译器和下一个阅读您的代码的人都能清楚地看到它。

10-05 23:33