waf*_*age 4 c++ compiler-construction optimization loops operators
我想知道在循环中进行小于或等于比较的效率是否更高,或者是否小于比较.<=
操作员是否指示计算机进行两次比较(是否小于,是否相等),还是简化了计算?以下面的例子为例.我想要一个循环而不是增量到1000.我应该将上限设置为1001并告诉它while i is < (OR !=) 1001, i++;
吗?或者我应该告诉它while i <= 1000, i++;
吗?编译器(GCC)是否会将其简化为相同的基本指令?
这取决于架构。
最初的冯·诺依曼 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);
。