完全重复:Is there a performance difference between i++ and ++i in C++?
完全重复:Difference between i++ and ++i in a loop?
什么更有效,i ++或++ i?
我只在Java和C / C ++中使用过它,但我真的要求所有语言都在这里实现。
在大学里我有一位教授告诉我们++我的效率更高,但已经有几年了,我想从Stack Overflow社区获得意见。
答案 0 :(得分:47)
i ++:
++ i:
通过优化,生成的程序集很可能是相同的,但++ i更有效。
编辑:请记住,在C ++中,我可能是支持前缀和后缀++运算符的任何对象。对于复杂对象,临时复制成本是不可忽略的。
答案 1 :(得分:36)
我会在其他地方寻找优化潜力。
答案 2 :(得分:7)
效率不应该是你的关注:它是意思。这两个不相同,除非它们是独立的:一个操作值的预先使用,另一个操作。
int i; i = 1; cout<<我++; //返回1
int i; i = 1; cout<< ++ I; //返回2
当含义不重要时,大多数编译器会将++ i和i ++(比如for循环)转换为相同的机器/ VM代码。
答案 3 :(得分:5)
在现代编译器上无关紧要。
int v = i++;
与
相同int v = i;
i = i + 1;
现代编译器会发现v
未使用,而计算v
的代码是纯粹的(没有副作用)。然后它将删除v
和分配代码并生成此
i = i + 1;
答案 4 :(得分:3)
这很重要!特别是如果你使用的是C ++ ......
++i // the prefered way, unless..
auto j = i++ // this is what you need
你应该总是使用前缀表示法来避免必要的复制开销,而使用C ++这很重要!
答案 5 :(得分:2)
好吧,在C ++中我认为它们有不同的用途,具体取决于你想要更新变量的时间。
效率不应该决定你何时使用另一个,但我认为它们无论如何都会有相同的效率。
答案 6 :(得分:2)
++我可能更有效地实现operator ++的非平凡实现,但即使在那种情况下,编译器也可以优化中间临时。
答案 7 :(得分:2)
++我不需要一个临时变量来存储东西。可以这样想:
++ i的
int preIncrement(int i)
{
i = i + 1;
return i;
}
我++
int i = 5; // as an example
int postIncrement(_i)
{
int temp = _i;
i = _i + 1;
return temp;
}
请参阅?后增量需要一个临时变量。假设编译器没有为你排序,几乎可以肯定。
当然,更重要的是程序逻辑;如果你担心这太多,你就有可能遇到The Sad Tragedy of Micro-Optimisation Theatre ... :)
答案 8 :(得分:0)
通常,在C ++中,postfix将需要增加对象的附加构造,而前缀直接应用于对象。 (或者我读过。)
由于我对此事的知识有限,我无法证明编译器如何处理它,因此可以为你处理它使其成为一个没有实际意义的点。
答案 9 :(得分:0)
通常,使用++ i比使用i ++更有效。 原因很简单,就是++ i与
完全相同i + = 1;
对于x86来说是单指令(可能是大多数其他广泛使用的架构)。 然而,i ++等于
tmp = i; i + = 1;
这是因为'i'的旧值是我评估的。显然,这需要更多的工作而不仅仅是i + = 1;
但如上所述,这对于足够聪明的编译器几乎没有影响,因为它会优化未使用的操作。对于许多解释语言(例如:PHP),++ i的速度可能微乎其微;但这种增加可以忽略不计。
答案 10 :(得分:0)
这取决于上下文,例如:
x = i++
在这种情况下,'x'将等于'i',只有在此之后才会'i'增加一。
x = ++i
在这种情况下,'i'将增加1,然后'x'的新值将分配给'x'。
在'for'循环的情况下,除了性能之外几乎没有明显的区别(++ i更快)。
答案 11 :(得分:0)
没有正确或错误的答案。
因为它取决于:
如何由编译器实现。
系统运行的CPU。
如果i
为字节或i
为双字
答案 12 :(得分:0)
输入i ++通常更容易,因此在生产力方面更有效。
但是,严重的是,如果 i 是本机数据类型(例如int,double等) - 没有区别。
如果它是用户定义的类型,例如
,则它是实现依赖的class Type
{
Type& operator ++(){}
const Type& operator ++(int i){}
};
T i;
答案 13 :(得分:0)
此Stack Overflow问题有一个很好的答案: Is there a performance difference between i++ and ++i in C?
我想补充一点,你应该更好地使用任何一个适合你的需求。除了对应用程序最关键的时候,它并不重要。从学术角度来看,最好编写能够表达所需内容并最终优化的代码。
答案 14 :(得分:0)
一个独立的“i ++;”或“++ i;”应该生成同样有效的代码。如果你在一个表达中使用它会产生差异,“副作用”就会发挥作用。
也就是说,有一段时间,当“全世界都是Vax”和编译器吸吮时,据说++我被认为比i ++更高效,即使在“for(i = 0; i< ; N; ++ i)“类型设置。
答案 15 :(得分:0)
++i
速度更快,因为i++
必须存储i
,然后递增它,然后返回i
的存储值。 ++i
只需递增i
然后返回。
// ++i
i += 1;
return i;
// i++
temp = i;
i += 1;
return temp;
答案 16 :(得分:0)
没有区别。使用最有意义的构造。
如果您的应用程序运行缓慢,我可以保证它永远不会是因为整数增量操作的速度差异。如果是,那就是编译器中的一个严重错误。速度 您的应用程序中的问题将是算法效率低下,等待I / O等等。
不要担心你没有的问题。 Premature optimization is the root of all evil
答案 17 :(得分:0)
++我在没有优化的x86汇编中比i ++少了一个处理器指令。
答案 18 :(得分:0)
除非我遗漏了什么,否则它们应该具有相同的效率。它们都应该导致单个添加指令。这只是添加指令发生位置的问题:在代码行的开头或结尾。
答案 19 :(得分:-1)
很难准确回答这个问题,因为它取决于编译器/解释器的实现。
但一般来说,你可以说大致将i ++扩展到以下说明:
COPY i to tmp
INCREMENT tmp
SAVE tmp as i
虽然++我将大致延伸到:
LOAD i
INCREMENT i
你不能只说++ i比i ++更快,因为语言实现非常聪明,当你知道你不会访问i ++的临时值时,他们可以优化这些指令。这通常发生在for循环中。所以在很多情况下它都是一样的。
如果您正在尝试进行这些微观优化,我建议您在选择之前进行描述/测量。