比起比较或小于或等于是否更有效?

waf*_*age 4 c++ compiler-construction optimization loops operators

我想知道在循环中进行小于或等于比较的效率是否更高,或者是否小于比较.<=操作员是否指示计算机进行两次比较(是否小于,是否相等),还是简化了计算?以下面的例子为例.我想要一个循环而不是增量到1000.我应该将上限设置为1001并告诉它while i is < (OR !=) 1001, i++;吗?或者我应该告诉它while i <= 1000, i++;吗?编译器(GCC)是否会将其简化为相同的基本指令?

Pap*_*ste 7

机器级架构将具有用于<和<=操作的OP代码,并且两个比较都可以在CPU的一个周期中进行.意思是没有区别.


Aki*_*nen 4

这取决于架构。

最初的冯·诺依曼 IAS 架构(1945)确实只有>=比较。

Intel 8086可以使用Loop label范式,这对应于do { } while (--cx > 0);
传统架构,LOOP不仅更小,而且更快。在现代架构中 LOOP被认为是复杂的操作,这比dec ecx; jnz label;优化大小(-Os)时慢,但这仍然具有重要意义。

进一步的考虑是某些 (RISC) 架构没有显式标志寄存器。那么,作为循环递减的副作用,就不能自由地进行比较。一些 RISC 架构还有一个特殊的“零”寄存器,这意味着与零的比较(以及所有其他数学运算)始终可用。具有跳转延迟槽的 RISC甚至可以从使用后递减中受益:do { } while (a-- > 0);

优化编译器应该能够将简单循环转换为给定架构的最优化版本,而不管语法如何。复杂的循环将依赖于迭代器、副作用或两者:for (i=0;i<5;i++) func(i);