为什么使用指针(低优化)会使程序更快?

Ahm*_*abi 0 c embedded assembly arm iar

我正在学习嵌入式 C 编程教程,然后意识到使用指针指向变量,然后使用它来取消引用可以使程序更快!

我有汇编的基本知识,但我不明白为什么将变量的地址分配给指针会更快,我们不是在谈论按引用或按指针或按值传递!

据我所知,

  • 没有指针的代码:内存地址已分配给寄存器R0,就像带有指针的代码中发生的情况一样。
  • 成为p_int寄存器的别名R0,这如何帮助使程序更快?

不使用指针的代码:

int counter = 0;
int main() {
    while (counter < 6) {
        ++(counter);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

那么大会就会像在此输入图像描述

相反,下面是带有指针的代码:

int counter = 0;
int main() {
    int *p;
    p = &counter;
    while (*p < 6) {
        ++(*p);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

那么大会就会像在此输入图像描述


更新

我联系了课程创建者,他很友善地为我重播并分解了它,为了帮助其他可能遇到同样问题的人,我将留下问题和答案

为了访问内存中的变量,CPU 需要该变量在寄存器之一中的地址。在最低级别的代码优化中,编译器在每次访问变量之前从代码存储器加载该地址。指针加快了速度,因为作为 main() 函数内的局部变量被分配到寄存器。这意味着该地址位于寄存器中(在本例中为 R0),不需要每次都加载并重新加载到寄存器中。在更高级别的优化下,编译器会生成更合理的代码,并且不带指针的代码与带指针的代码一样快。--彩信

Lun*_*din 5

一般来说:没有理由使用指针会使程序运行得更快。在没有启用所有优化的情况下讨论程序的性能(就像课程创建者在您的引用中所做的那样)是没有意义的。这当然不是改变编写代码方式的理由。

另一个经常使用但已过时的技巧是将此类循环编写为递减计数而不是递增计数,因为与零进行比较通常比与值进行比较更快。但这也不应该影响您编写代码的方式,因为现代编译器可以为您进行优化。

程序员应该做的,以及编写课程的人应该教的,就是编写尽可能简单易读的代码。这意味着你的两个例子都很糟糕,因为它们不必要地晦涩难懂,而且是“不成熟的优化”的例子。更好的代码是:

  int counter;
  ...
  for(counter=0; counter < 6; counter++)
  {}
Run Code Online (Sandbox Code Playgroud)

这与代码的可读性差不多,没有理由相信上面的代码在任何已知系统上的性能都会比您的示例差。

做这个:

  • 编写尽可能可读的代码。
  • 在发布中,启用优化。
  • 如果存在性能问题,请进行基准测试并查找瓶颈。
  • 如果需要,手动优化瓶颈。可能考虑到特定的系统。