c - 循环计数器和指针

标签 c performance pointers loops

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

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

我想知道这是否是一个好的做法,尤其是在 tigh 循环的情况下。起初我认为编译器会足够聪明,只查看一次“graph->nvertices”,而不是在每次迭代时都查看它,但这似乎是不可能的,因为 graph->nvertices 可能会在循环内发生变化。编写起来更智能、更快速:

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

它似乎更快,因为它不需要多次查看指针,但它确实需要创建一个新变量。

注意:我想在这种情况下,能够阅读一些汇编代码以查看编译器实际在做什么是很好的,如果有人有很好的引用,我愿意接受建议。

最佳答案

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

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

但是,您将对缓存性能造成严重破坏。我认为您建议的方法是最直接的,这有助于编译器和下一个阅读您代码的人清楚地了解自己。

关于c - 循环计数器和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6336726/

相关文章:

c - 如何在结构中正确使用指针?

c - 如何访问字符数组的第一个字符?

C++:使用指向 vector 开头的指针访问 vector 元素

c - 检测文件 A-Z 和 AA-ZZ 中的字母

c# - 在 C# 中使用命名空间会影响性能吗?

mysql - 随着我的 mysql 数据库的增长,我有什么选择

c# - WebAPI 首次调用服务缓慢

Program.exe 中的 c++ : Unhandled exception at 0x57B4B2CE (msvcr120d. dll):0xC0000005:读取位置 0xCDCCDC8 访问冲突

c - 如何调用仅在特定操作系统版本中可用的 C 函数?

c - 如何创建 POSIX 共享消息队列而不将其仅创建为 root 访问权限?