我正在读
this article,我注意到了jz指令.这让我想到:
会这个代码的汇编
for (int i=max;i!=0;--i){
//Some operation
}
优于此代码的程序集?
for (int i=0;i<max;++i){
//Some operation
}
只要您不关心数据是否随着i的增加而处理,就没有语义差异.缓存未命中也不应该受到影响,因为它们可以以任何方式顺序工作.
我在汇编时写的不够好,但是我认为第一个例子只使用jz.第二个是使用cmp,然后是jg,还需要另一个变量max.第一个例子只需要循环计数器,因为0是隐式的.
这也可能是编译器用来优化的东西,但我可以想象它无法进行优化的情况.
最佳答案 假设我们有cmp a,b.
处理器将临时减去操作数(不影响它们的值),正确设置标志,然后评估jmp跳转操作.
所以,在你的例子中制作一个jz更快,而不是cmp和一个jmp.