2011-04-01 104 views
1

我想知道哪种编写循环的最佳方法?哪种编写循环的最佳方式是?

计数Down_to_Zero循环比Count_Up_Loops更好吗?特别是在嵌入式系统中,哪一个更好?

+1

与嵌入式系统有什么关系?即使这样做,它也会针对正在使用的处理器。 – 2011-04-01 07:32:18

回答

9

在嵌入式世界可以更好时,你正在使用的处理器使用优先一种方案到另一种依赖。例如,PIC处理器有一条指令“递减并跳转,如果不是零”。这对于在单个指令中执行倒数“for”循环非常有用。

其他处理器有不同的指令集,因此适用不同的规则。

您可能还必须考虑编译器优化的影响,这可能会将计数转换为可能更有效的倒数版本。

一如既往,如果您不得不担心这些问题,那么您正在使用错误的处理器和工具。用汇编语言编写高级语言的想法是向维护工程师解释软件是如何工作的。如果使用倒计数循环的反直觉则不然,不管处理器效率(微小)的损失如何。

+0

如果我们在循环终止处使用倒数归零循环,则可以通过编译器 – 2011-04-01 08:02:44

+2

来优化与零的比较。如果您查看编译器生成的代码,我已经看到由于这个原因递减循环计数器生成的循环计数器。正如我在答复中所说的,如果您不得不微观优化您的代码,然后猜测您的编译器,那么您正在使用错误的处理器和工具。如果你的循环中有一两个额外的指令是关键的,那么你有实际问题 – 2011-04-01 08:09:48

+0

@AMIT编译器应该能够在没有编程人员的帮助下理解优化。 – Lundin 2011-04-01 15:13:59

3

这是个人偏好。在数组的情况下,从0开始计数通常更好,因为您通常需要按顺序处理每个值。这两种风格本质上都不是很好,但它们可能会有不同的结果(例如,如果您打印数组中的每个值,输出的顺序将会不同)。

在许多情况下(与阵列的显着的例外),最合乎逻辑的选择是使用一个while循环而不是一个循环for,例如从文件中读取:

int c; 
while ((c = fgetc(somefile)) != EOF) 
    /* Do something */ 
3

需要担心的主要问题是您或其他人将在将来某段时间读取代码,并且人员必须能够理解代码的意图。

换句话说,用纯文本编写代码。如果你打算做十次,从0到小于10。如果您打算向后走过一个数组,则从较高值循环到较低值。

避免在for语句的标题中放置与循环控制无关的任何内容。

当谈到效率时,您可以放心地将其留给编译器。

2

最好的方式来写一个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 ++会创建一个临时不可见变量。

对于大多数系统而言,循环的顺序应如上所述,因为这通常是解决高速缓存存储器的最有效方法,这是相当先进的主题。

相关问题