回答
在嵌入式世界可以更好时,你正在使用的处理器使用优先一种方案到另一种依赖。例如,PIC处理器有一条指令“递减并跳转,如果不是零”。这对于在单个指令中执行倒数“for”循环非常有用。
其他处理器有不同的指令集,因此适用不同的规则。
您可能还必须考虑编译器优化的影响,这可能会将计数转换为可能更有效的倒数版本。
一如既往,如果您不得不担心这些问题,那么您正在使用错误的处理器和工具。用汇编语言编写高级语言的想法是向维护工程师解释软件是如何工作的。如果使用倒计数循环的反直觉则不然,不管处理器效率(微小)的损失如何。
如果我们在循环终止处使用倒数归零循环,则可以通过编译器 – 2011-04-01 08:02:44
来优化与零的比较。如果您查看编译器生成的代码,我已经看到由于这个原因递减循环计数器生成的循环计数器。正如我在答复中所说的,如果您不得不微观优化您的代码,然后猜测您的编译器,那么您正在使用错误的处理器和工具。如果你的循环中有一两个额外的指令是关键的,那么你有实际问题 – 2011-04-01 08:09:48
@AMIT编译器应该能够在没有编程人员的帮助下理解优化。 – Lundin 2011-04-01 15:13:59
这是个人偏好。在数组的情况下,从0开始计数通常更好,因为您通常需要按顺序处理每个值。这两种风格本质上都不是很好,但它们可能会有不同的结果(例如,如果您打印数组中的每个值,输出的顺序将会不同)。
在许多情况下(与阵列的显着的例外),最合乎逻辑的选择是使用一个while
循环而不是一个循环for
,例如从文件中读取:
int c;
while ((c = fgetc(somefile)) != EOF)
/* Do something */
需要担心的主要问题是您或其他人将在将来某段时间读取代码,并且人员必须能够理解代码的意图。
换句话说,用纯文本编写代码。如果你打算做十次,从0到小于10。如果您打算向后走过一个数组,则从较高值循环到较低值。
避免在for
语句的标题中放置与循环控制无关的任何内容。
当谈到效率时,您可以放心地将其留给编译器。
最好的方式来写一个for循环是:
for(i=0; i<N; i++)
for(j=0; j<N; j++)
{
array[i][j] = ... ;
}
其他的都是“过早优化”,即事情,编译器真的应该能够为您处理。
但是,如果你有一个愚蠢的编译器,从N计数到零计数可能更有效,因为与零比较比大多数CPU上的值更快。
请注意,如果可能,N应该是一个常量表达式。在循环比较中不需要像strlen()等函数调用。
++如果代码可能最终在C++编译器中执行,那么C++标准保证++ i比i ++更快,因为i ++会创建一个临时不可见变量。
对于大多数系统而言,循环的顺序应如上所述,因为这通常是解决高速缓存存储器的最有效方法,这是相当先进的主题。
- 1. 在Python中编写循环的最优雅方式是什么?
- 2. 解决这种JavaScript死循环的最佳方法是什么?
- 3. DynamoDB AWS以一种循环的方式检索数据的最佳方式
- 4. 编写IF语句的最佳方式
- 5. 哪一种是自动备份的最佳方式?
- 6. 哪个是写数据缓冲到文件的最佳方式
- 7. 循环动画的最佳方式是什么?
- 8. 在Java中退出循环的最佳方式是什么?
- 9. C++什么是停止for循环的“最佳”方式?
- 10. VBA什么是循环中增量的最佳方式
- 11. 实现并行无限循环的最佳方式是什么?
- 12. 循环是建立表格的最佳方式吗?
- 13. 实现颜色循环背景的最佳方式是什么?
- 14. 在JSON中循环数组的最佳方式是什么?
- 15. 迭代循环包装索引的最佳方式是什么?
- 16. 什么是在scala中循环数组的最佳方式
- 17. 这两种循环方式和哪一种更适合使用?
- 18. 编写jQuery插件的最佳方式 - 如果有这种方法?
- 19. 在django中编写组合框的最佳方式是什么?
- 20. 在ASP.NET MVC中编写表单的最佳方式是什么?
- 21. 从Java编写excel文件的最佳方式是什么?
- 22. 在scala中编写main的最佳方式是什么?
- 23. 什么是为SQLite编写验证图层的最佳方式
- 24. MVC是编写asp.net应用程序的最佳方式吗?
- 25. 在Cocos2d中编写D-Pad的最佳方式是什么?
- 26. 防止DocumentEvent循环的最佳方法?
- 27. 在c中编写解析器的最佳/最快的方式#
- 28. 将Grails包含到Liferay中的最佳方法是哪种?
- 29. “明确:两种”的最佳方式
- 30. 最佳编码方式
与嵌入式系统有什么关系?即使这样做,它也会针对正在使用的处理器。 – 2011-04-01 07:32:18