Possible Duplicate:
Is there a performance difference between i++ and ++i in C++?
Is there a reason some programmers write ++i
in a normal for loop instead of writing i++
?
Possible Duplicate:
Is there a performance difference between i++ and ++i in C++?
Is there a reason some programmers write ++i
in a normal for loop instead of writing i++
?
For integers, there is no difference between pre- and post-increment.
If i
is an object of a non-trivial class, then ++i
is generally preferred, because the object is modified and then evaluated, whereas i++
modifies after evaluation, so requires a copy to be made.
i++
is somewhat idiomatic in C code; if you regularly use both languages, it can get confusing... –
Cyrenaic i
is an instance of some class that overloads the increment operator. Are you saying that if I were to simply post-increment (not in a loop control statement, but rather just increment it) (i.e. i++;
), that the compiler wouldn't be able to see that I'm not doing anything with the return value, and automatically re-write that to be ++i
? –
Ascendancy operator++()
or operator++(int)
for preincrement and postincrement respectively). If they're actually equivalent, and if the call is inlined, and if the copies involved are all removed by the optimizer, then the emitted code may end up the same - try it. But the compiler certainly can't replace one with the other solely on the basis that the result is unused. I don't especially care, because I write ++i
for clarity (as I perceive it). "increment i" -> "++i". –
Apiculate ++i
is slightly more efficient due to its semantics:
++i; // Fetch i, increment it, and return it
i++; // Fetch i, copy it, increment i, return copy
For int-like indices, the efficiency gain is minimal (if any). For iterators and other heavier-weight objects, avoiding that copy can be a real win (particularly if the loop body doesn't contain much work).
As an example, consider the following loop using a theoretical BigInteger class providing arbitrary precision integers (and thus some sort of vector-like internals):
std::vector<BigInteger> vec;
for (BigInteger i = 0; i < 99999999L; i++) {
vec.push_back(i);
}
That i++ operation includes copy construction (i.e. operator new, digit-by-digit copy) and destruction (operator delete) for a loop that won't do anything more than essentially make one more copy of the index object. Essentially you've doubled the work to be done (and increased memory fragmentation most likely) by simply using the postfix increment where prefix would have been sufficient.
For integers, there is no difference between pre- and post-increment.
If i
is an object of a non-trivial class, then ++i
is generally preferred, because the object is modified and then evaluated, whereas i++
modifies after evaluation, so requires a copy to be made.
++i
for all types, so that you are in the habit of using it for all types. –
Aminta i++
is somewhat idiomatic in C code; if you regularly use both languages, it can get confusing... –
Cyrenaic i
is an instance of some class that overloads the increment operator. Are you saying that if I were to simply post-increment (not in a loop control statement, but rather just increment it) (i.e. i++;
), that the compiler wouldn't be able to see that I'm not doing anything with the return value, and automatically re-write that to be ++i
? –
Ascendancy operator++()
or operator++(int)
for preincrement and postincrement respectively). If they're actually equivalent, and if the call is inlined, and if the copies involved are all removed by the optimizer, then the emitted code may end up the same - try it. But the compiler certainly can't replace one with the other solely on the basis that the result is unused. I don't especially care, because I write ++i
for clarity (as I perceive it). "increment i" -> "++i". –
Apiculate ++i
is a pre-increment; i++
is post-increment.
The downside of post-increment is that it generates an extra value; it returns a copy of the old value while modifying i
. Thus, you should avoid it when possible.
With integers, it's preference.
If the loop variable is a class/object, it can make a difference (only profiling can tell you if it's a significant difference), because the post-increment version requires that you create a copy of that object that gets discarded.
If creating that copy is an expensive operation, you're paying that expense once for every time you go through the loop, for no reason at all.
If you get into the habit of always using ++i
in for loops, you don't need to stop and think about whether what you're doing in this particular situation makes sense. You just always are.
No compiler worth its weight in salt will run differently between
for(int i=0; i<10; i++)
and
for(int i=0;i<10;++i)
++i and i++ have the same cost. The only thing that differs is that the return value of ++i is i+1 whereas the return value of i++ is i.
So for those prefering ++i, there's probably no valid justification, just personal preference.
EDIT: This is wrong for classes, as said in about every other post. i++ will generate a copy if i is a class.
++i
calls i.operator++()
and i++
calls i.operator(int)
. See my answer for implementation details. –
Erythrite There is a reason for this: performance. i++ generates a copy, and that's a waste if you immediately discard it. Granted, the compiler can optimize away this copy if i
is a primitive, but it can't if it isn't. See this question.
++i
and i++
is exactly the same. –
Maggard As others have already noted, pre-increment is usually faster than post-increment for user-defined types. To understand why this is so, look at the typical code pattern to implement both operators:
Foo& operator++()
{
some_member.increase();
return *this;
}
Foo operator++(int dummy_parameter_indicating_postfix)
{
Foo copy(*this);
++(*this);
return copy;
}
As you can see, the prefix version simply modifies the object and returns it by reference.
The postfix version, on the other hand, must make a copy before the actual increment is performed, and then that copy is copied back to the caller by value. It is obvious from the source code that the postfix version must do more work, because it includes a call to the prefix version: ++(*this);
For built-in types, it does not make any difference as long as you discard the value, i.e. as long as you do not embed ++i
or i++
in a larger expression such as a = ++i
or b = i++
.
copy
entirely - unused value with no side-effects. ++i
does save you wondering whether the optimization was successful, and more importantly it just obviously makes more sense ;-) –
Apiculate when you use postfix it instantiates on more object in memory. Some people say that it is better to use suffix operator in for loop
Personal preference.
Usually. Sometimes it matters but, not to seem like a jerk here, but if you have to ask, it probably doesn't.
© 2022 - 2024 — McMap. All rights reserved.
++i
for all types, so that you are in the habit of using it for all types. – Aminta