cxh_nuaa_2001 发表于 2004-9-19 09:57:32

++i和i++

我曾经在一本书上看到,在单独用 i++ 或者 ++i 的时候,++i 比 i++的执行效率高一些。我想了半天,还是搞不明白。我看linux内核也都用的是i++,所以我就怀疑这个说法了。
有谁知道吗?是不是真的高一些啊?请详细的讲解一下,谢谢!

bzimage 发表于 2004-9-19 10:35:25

:shock:

ShiChao 发表于 2004-9-19 11:20:22

你的那本书是讲C++的吧

我记得C++里面,如果你重载了++运算符,后置++是通过前置++实现的

_z_ 发表于 2004-9-19 11:24:45

have nothing to do with kernel

cxh_nuaa_2001 发表于 2004-9-20 11:42:27

是讲 c++ 的!
我昨天又看了一遍,似乎明白了一点。当初没有看那么细。

不过如果是基本的数据类型,如整形,是不是经过编译后就是一样的了?

xinlinux 发表于 2004-9-23 20:18:42

a=++i表示先做++运算,然后做赋值给a.
a=i++表示在赋值后做+=运算

kakuyou 发表于 2004-9-24 08:52:11

应该是一样的。

为什么++会单独成为一条指令呢?原理上它和i=i+1是一样的。因为例如intel cpu上有专门的inc 这条指令,就是自加一指令,它比普通的add指令要快。我想大部分cpu也有这条指令,所以,经过编译后,都应该变成inc指令,所以我认为不会有性能区别。

ffxz 发表于 2004-9-24 15:05:51

不知道,猜想:
int i_inc(int i)
{
    int j;

    j = i;
    i = i + 1;

    return j;
}

int inc_i(int i)
{
    i = i + 1;

    return i;
}

具体得看汇编。

i18n 发表于 2004-10-2 00:48:56

这个和编译器有关吧

dongni386 发表于 2004-11-29 10:09:36

看汇编代码吧
好象i++和++i单独成一条语句是没什么区别
int main()
{
int i;
i++;
++i;
}

        .file        "u.c"
        .def        ___main;        .scl        2;        .type        32;        .endef
        .text
.globl _main
        .def        _main;        .scl        2;        .type        32;        .endef
_main:
        pushl        %ebp
        movl        %esp, %ebp
        subl        $8, %esp
        andl        $-16, %esp
        movl        $0, %eax
        movl        %eax, -8(%ebp)
        movl        -8(%ebp), %eax
        call        __alloca
        call        ___main
        leal        -4(%ebp), %eax
        incl        (%eax)
        leal        -4(%ebp), %eax
        incl        (%eax)
        leave
        ret

sjinny 发表于 2004-12-2 10:35:29

如果i是整数当然没多少差别,但是如果i是一个很庞大的对象,那么++i好象会先返回一个临时的对象然后再执行++操作,这样的开销差别就会比较明显,好象是这样的……

duoxing 发表于 2004-12-11 21:20:25

怎么还有这种说法呢?它们是代表不同的意思啊,就是有效率的问题也不能混淆的啊,更何况是否存在效率问题还有待考证,反正我是不同意这样的说法,也没有为什么,只是靠编程的经验
页: [1]
查看完整版本: ++i和i++