【发布时间】:2019-09-19 14:24:33
【问题描述】:
我正在学习嵌入式 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;
}
更新
我联系了课程创建者,他很乐意为我重播并分解它,为了帮助可能遇到同样问题的其他人,我会留下问题和答案
要访问内存中的变量,CPU 需要这个地址 变量之一的寄存器。在代码的最低级别 优化,编译器从代码内存中加载这个地址 在每次访问变量之前。指针速度 这是因为作为 main() 函数中的局部变量是 分配给一个寄存器。这意味着该地址位于 寄存器(在这种情况下为 R0)并且不需要加载和 每次重新加载到寄存器中。在更高级别的优化 编译器生成更合理的代码和没有 指针与指针一样快。 --彩信
【问题讨论】:
-
什么编译器?您使用了什么级别的优化?
-
第一个你要写的 while(counter
-
是什么让您“意识到”它更快?你是怎么测量的?此外,如果不应用编译器优化,结果在很大程度上是无关紧要的,因为如果性能至关重要,您将使用优化。未优化的代码有利于调试体验而不是性能。
-
避免使用场外图像,尤其是那些在个人云存储中可能是临时的图像。并且不要像您在此处所做的那样发布 text 的图像。
-
对调试模式代码进行基准测试毫无意义。在对其进行基准测试或查看之前启用优化。无论如何,如果您仍然想知道为什么一个低效的 asm 循环比另一个低效的 asm 循环之后的细节,请复制/粘贴 asm 输出以使其成为正确的minimal reproducible example。 (在什么硬件上?)
标签: c assembly arm embedded iar