完全重复: 在C++中,i++和++i之间有性能差异吗?
完全重复: 循环中i++和++i的区别是什么?
i++和++i哪个更高效?
我只用过Java和C/C++,但我实际上是在询问这种语言的所有实现。
在大学里,我的一位老师向我们展示了++i更高效,但已经过了几年,我想从Stack Overflow社区中获取意见。
完全重复: 在C++中,i++和++i之间有性能差异吗?
完全重复: 循环中i++和++i的区别是什么?
i++和++i哪个更高效?
我只用过Java和C/C++,但我实际上是在询问这种语言的所有实现。
在大学里,我的一位老师向我们展示了++i更高效,但已经过了几年,我想从Stack Overflow社区中获取意见。
i++ :
++i :
开启优化后,生成的汇编代码可能相同,但是 ++i 更有效率。
注意,在 C++ 中,i 可能是任何支持前缀和后缀 ++ 运算符的对象。对于复杂对象来说,临时副本的代价是不可忽略的。
我会在其他地方寻找优化潜力。
效率不应该是您关注的重点:它是意义。除非它们是独立的,否则两者并不相同:一个在使用值之前操作,另一个在使用之后操作。
int i; i = 1; cout << i++; //返回1
int i; i = 1; cout << ++i; //返回2
当意义不重要时,大多数编译器将把++i和i++(比如在for循环中)转换为相同的机器/虚拟机代码。
在现代编译器中,这并不重要。
int v = i++;
与
是相同的。int v = i;
i = i + 1;
现代编译器会发现 v
没有被使用,而且计算 v
的代码是纯的(没有副作用)。然后它会删除 v
和赋值代码,并生成以下代码:
i = i + 1;
这很重要!特别是如果你在C++领域使用自定义迭代器协议...
++i // the prefered way, unless..
auto j = i++ // this is what you need
为了避免必要的复制开销,您应该使用前缀表示法,但它只适用于迭代器,不适用于内置本地类型,这些类型只需要一条指令。
++i
"int preIncrement(int i)
{
i = i + 1;
return i;
}
i++
int i = 5; // as an example
int postIncrement(_i)
{
int temp = _i;
i = _i + 1;
return temp;
}
在C++中,我相信它们有不同的用途,取决于你想何时更新变量。
效率不应该决定你使用哪个而不是另一个,但我认为无论哪种方式它们都应该具有相同的效率。
对于operator++的非平凡实现,++i可能更有效率,但即使在这种情况下,编译器也可以优化掉中间临时变量。
++i
更快,因为i++
需要存储i
,然后增加它,最后返回i
的存储值。而++i
只需增加i
,然后返回它。
// ++i
i += 1;
return i;
// i++
temp = i;
i += 1;
return temp;
通常来说,输入i++更容易,因此在生产力时间方面更有效率。
但是,如果i是本地数据类型(例如int、double等),则没有区别。
如果它是用户定义的类型,则取决于实现。
class Type
{
Type& operator ++(){}
const Type& operator ++(int i){}
};
T i;