i++ 与 ++i 的性能区别April 21, 2008

很多有关程序设计的书中都会说明 ++i 与 i++ 的区别。比如经典的论述就是

i = 5;
k = i++; // 此时 k 还是 5,但是 i 自增以后已经是 6

i = 5;
k = ++i;  // 此时 k 已经是 6,k 是 i 自增以后的值

可能这样的说明还不够直观。总而言之,i++; 是一个右值,而 ++i 是一个左值。

加深印象,上述的两条语句可以用下面两个函数表示。

i++ 为

function () {
    tmp = i;
    i = tmp + 1;
    return tmp;
}

++i 为

function () {
    i = i + 1;
    return i;
}

可以参考 这里获知详情 。总而言之,i++ 语句需要个临时变量,去存储返回自增前的值。

不要忽略这个变量的意义,了解过 C 等「低级」语言的朋友,可能会了解变量的内部机制(重新祭奠我老去的 C 语言知识)。首先,申请(malloc)一段内存空间,然后将值塞(push,压栈)进去,最后不用了释放(free)。

大家可能在循环中会经常的使用 i++ 这样的操作。在不影响逻辑的前提下,我建议使用 ++i ,虽然这点的优化非常的小。

最后,感谢 小马 的指出。

§ 9 条评论

  1. k=i++:
    mov ax,i
    mov k,ax
    inc ax
    mov i,ax

    k=++i:
    mov ax,i
    inc ax
    mov k,ax
    mov i,ax

    汇编语句写的不一定对,但是思路就是这样,所以说,i++和++i一样

  2. JS不清楚,不过我想JS应该也不会用函数的办法来做i++和++i吧

  3. @robin 每个语言的实现方式会不一样,可以看下这里: http://www.moon-soft.com/doc/11779.htm

  4. lxlxdw lxlxdw

    @robin2008-04-21 15:28:59

    一样?
    结束后K值不同诶

  5. vvoody vvoody

    交给编译器吧。

  6. goseaside goseaside

    勿匆忙下结论,也许机器码并没有不同。

  7. goseaside goseaside

    我觉得,以讹传讹,而不加以识别,是不对的。

  8. @goseaside 的确,我个人对于这篇 Blog 也表示怀疑,尤其是每个浏览器的 Javascript 实现机制并不完全一样。希望大家能够批判的接受。

  9. 关于i++和++i的例子代码,让我有个醍醐灌顶的感觉,谢谢

添加评论




* Required (but your email address will never be published)

Yahoo 统计