首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于++i和i++的效率有关问题

2012-03-25 
关于++i和i++的效率问题C++ Primer 4的162页,提到了这样一句“前自增操作需要做的工作更少,只需要加以后返

关于++i和i++的效率问题
C++ Primer 4的162页,提到了这样一句“前自增操作需要做的工作更少,只需要加以后返回加一后的结果即可”,有点不清楚了,
如j = ++i;不是分两步吗?一:i = i+1;二:j=i;吗?j = i++;不就是把前面的两部倒过来就行吗?

怎么理解?
还有在
for(int i=0; i<n; i++)与for(int i=0; i<n; ++i)效率有区别吗?

若有,当n很大时,可能会有明显的效率差别。 


[解决办法]
现在 编译器 效率应该 一样,
解释有偏差,也不会很大
[解决办法]
i++返回的是一个临时变量,而++i返回的是i本身。并且在很多实现方式中,后置的++是有前置的++来实现的。因而
效率上讲是有差别的。

尤其是对大型的变量而言。如i是一个很大的结构体,或者很大的一个类。这就会造成过大的浪费

++i的结果应该是一个左值,而i++的结果应该是个右值

很多书里面主张用++i。
[解决办法]
一般大家都说++i快过i++。
原因也有不同的说法。

记住有这么回事就好了。

俺最初喜欢用++i,后来改成了i++,现在又变成了++i...
[解决办法]
没有本质区别(个人以为)主要区别在于 i++;先使用后自加.
++i 先自加,后使用
例子:
int i=1;
j=i++;
运行后 j=1;i=2
int i=1;
j=++i;
运行后 j=2;i=2;
回答完毕!~

[解决办法]
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)

[解决办法]
i++生成一个临时变量,所以比如用在for(int i=0; i<n; i++)里,效率不如 ++i。但这个是纯理论上的,实际上没什么差异,消耗的时间不再这块。而且优化后,可能和 ++i是一样的代码
[解决办法]
当i是内置数据类型时,编译器进行优化后是一样的,但当i是用户定义的类类型时就会出现效率差异,但倒低谁快得看类设计者怎么重载++算运符,不过通常情况下i++是通过++i实现的 谁快也就一目了然了
[解决办法]
primer的意思应该是针对于自定义类的运算符重载的效率。
考虑类Foo定义如下

C/C++ code
class Foo {public:    int data;public:    Foo() : data(0) { }    Foo(int data) : data(data) { }    Foo(const Foo &foo) : data(foo.data) { }public:    Foo &operator ++() { ++(this->data); return (*this); }    Foo operator ++(int) { Foo retval(*this); ++(this->data); return (retval); }};
[解决办法]
有一本讲效率的书上说++i比i++效率高很多
[解决办法]
如果是int等内置类型的变量,2者的相差无几,但是如果是其他类型就有区别了,比如一个复杂的迭代器类型,复制一次,代价不小的。
[解决办法]
在两者的作用一样时推荐使用++i,一旦i为一个自定义类型的参数,且大量运行这类语句,++i要比i++效率高出不少。因为i++要保存一个临时变量并返回。

热点排行