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

C 为什么使用指针(低优化)会使程序更快?,c,assembly,arm,embedded,iar,C,Assembly,Arm,Embedded,Iar,我在学习一个关于嵌入式C编程的教程,然后意识到使用指针指向变量,然后使用它去引用会使程序更快 我有汇编的基本知识,但我不明白为什么将变量的地址分配给指针会更快,我们不是在讨论按引用传递、按指针传递或按值传递 据我所知 无指针代码:内存地址已分配给寄存器R0, 就像在代码中使用指针时发生的一样 p_int成为寄存器R0的别名,这如何有助于提高程序速度 不使用指针的代码: int counter = 0; int main() { while (counter < 6) {

我在学习一个关于嵌入式C编程的教程,然后意识到使用指针指向变量,然后使用它去引用会使程序更快

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

据我所知

  • 无指针代码:内存地址已分配给寄存器
    R0
    , 就像在代码中使用指针时发生的一样
  • p_int
    成为寄存器
    R0
    的别名,这如何有助于提高程序速度
不使用指针的代码:

int counter = 0;
int main() {
    while (counter < 6) {
        ++(counter);
    }
    return 0;
}
int counter = 0;
int main() {
    int *p;
    p = &counter;
    while (*p < 6) {
        ++(*p);
    }
    return 0;
}
int计数器=0;
int main(){
while(计数器<6){
++(柜台);
}
返回0;
}
那么大会就像是在

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

int counter = 0;
int main() {
    while (counter < 6) {
        ++(counter);
    }
    return 0;
}
int counter = 0;
int main() {
    int *p;
    p = &counter;
    while (*p < 6) {
        ++(*p);
    }
    return 0;
}
int计数器=0;
int main(){
int*p;
p=&计数器;
而(*p<6){
++(*p);
}
返回0;
}
那么大会就像是在


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

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

它正好相反(几乎相同,但还有一条指令:):

它正好相反(几乎相同,但还有一条指令:):


编译器在不同优化级别之间的任何行为都是特定于实现的。所以,尽管你已经被展示了一些可能与直觉相反的东西,作为一种证明,你不应该被教导这是一种因果关系


以不同的方式编写代码总是会触发性能改进或回归,而不同的优化级别有时会导致错误的更改。这应该是显而易见的,但是任何优化级别越高导致性能越差的场景(本例中的情况并非如此)都应该被视为编译器的问题。

编译器在不同优化级别之间的任何行为都是特定于实现的。所以,尽管你已经被展示了一些可能与直觉相反的东西,作为一种证明,你不应该被教导这是一种因果关系


以不同的方式编写代码总是会触发性能改进或回归,而不同的优化级别有时会导致错误的更改。这应该是显而易见的,但是任何优化级别越高导致性能越差的场景(本例中不是这样)都应该被视为编译器的问题。

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

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

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

  int counter;
  ...
  for(counter=0; counter < 6; counter++)
  {}
int计数器;
...
用于(计数器=0;计数器<6;计数器++)
{}
这与代码的可读性差不多,没有理由相信上面的示例在任何已知系统上的性能都会比您的示例差

这样做:

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

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

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

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

  int counter;
  ...
  for(counter=0; counter < 6; counter++)
  {}
int计数器;
...
用于(计数器=0;计数器<6;计数器++)
{}
这大约是可读的