LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1585|回复: 18

++i和i++

[复制链接]
发表于 2004-9-19 09:07:42 | 显示全部楼层 |阅读模式
我曾经在一本书上看到,在单独用 i++ 或者 ++i 的时候,++i 比 i++的执行效率高一些。我想了半天,还是搞不明白。我看linux内核也都用的是i++,所以我就怀疑这个说法了。
    有谁知道吗?是不是真的高一些啊?请详细的讲解一下,谢谢!
发表于 2004-9-19 12:18:16 | 显示全部楼层
i++是先使用i的值后在自增,所以通常的实现为:

   temp = i;
    ++i;
    return temp;
很明显,多处了一个中间变量,建立和销毁这个中间变量就是
引起效率低下的原因。
发表于 2004-9-19 12:27:10 | 显示全部楼层
这个开销几乎可以不记吧。。。。。
发表于 2004-9-19 12:50:04 | 显示全部楼层
开销再少也要占时间和空间吧,你要是执行如
for(i=0; i < 1e6; i++) 等,i++ 和 ++i 的区别就大了。

这个是针对内建的数值对象而言。而且要是要c++,i如果是 某个类的一个对象,想象多一个temp对象的坏处吧。通常就意味着那将是两次拷贝构造函数和两次析构函数的调用。
发表于 2004-9-19 12:54:39 | 显示全部楼层
c++里有对象的这种操作吗?
发表于 2004-9-19 13:06:13 | 显示全部楼层
内建对象当然直接支持++。
自定义类当然得重载++操作符。
发表于 2004-9-19 19:31:06 | 显示全部楼层
经测试得出gcc 在编译的时候会把i++ ++i i+1 编译成都是用同样的累加指令,这个指令比add指令要快。所有这个命题应该是和具体的编译器相关的。
 楼主| 发表于 2004-9-20 11:32:39 | 显示全部楼层
jzh兄,我想知道,对与内建的类型的 ++i 和 i++ 是不是编译后也有
temp = i;
++i;
return temp;

这种情况?C++ 的重载++的情况我知道,但是象一些基本的类型,如int是不是也有上面这种情况呢?

还有,zbw76兄,是不是别的编译器也会按gcc那样编译++i 和 i++呢?
 楼主| 发表于 2004-9-20 11:38:42 | 显示全部楼层
我觉得对于基本的数据类型,如 int ,i++ 编译时可以先使用 i 变量,然后再 inc i。而不必要有
temp = i;
++i;
return temp;
这个操作,不知对不对。

还有这是不是跟具体的语言或者编译器有关。如 c++,它提供了运算符重载的功能,是不是有影响?
发表于 2004-9-20 23:05:15 | 显示全部楼层
to chx_nuaa_200:
  对于基本数据类型.仅仅只是自增的话,也即
  i++;
  ++i;
  生成的汇编指令是一样的。
  但可以肯定的是,对于类似赋值性质的语句,如
  int num = i++;
  int num = ++i;
  肯定不一样,前一个语句一定会有一个中间变量来保存i的初始值。
  然后i的值才递增。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表