17

Why in solidity, i++ & ++i works the same but one costs a little bit more gas?

Take a look at this contract:

contract foobar {
    
    uint[] public arr = [1,2,3,4,5];

    function find() public view returns(bool) {
            for(uint i = 0; i < arr.length; i++ /*++i*/) {
            if(arr[i] == 5) {
                return true;
            }
        }
        return false;
    }
}

When I run this contract using i++ this is what the contract's cost is:

// i++
// gas  388824 gas
// transaction cost 338107 gas 
// execution cost   338107 gas 
// foobar.find() execution cost 36221 gas

And when I run the same function using ++i, this is what the cost is:

// ++i
// gas  388327 gas
// transaction cost 337675 gas 
// execution cost   337675 gas
// foobar.find() execution cost 36201 gas

Clearly, i++ costs more gas than ++i, But Why? Thanks

2
  • 6
    Pre-increment and post-increment usually result in slightly different execution steps, this is not unique to Solidity. Related: What is the difference between ++i and i++?
    – Mast
    Commented Aug 7, 2022 at 18:18
  • 1
    Newer versions of solidity should optimize this. In the past, the difference could be attributed to the codegen for i++ not getting inlined. Try --via-ir with the optimizer, they should have identical gas cost, except when the semantics are different.
    – hrkrshnn
    Commented Aug 9, 2022 at 18:28

1 Answer 1

30

They do not work the same. i++ gets compiled to something like

j = i;
i = i + 1;
return j

while ++i gets compiled to something like

i = i + 1;
return i;

Long story short, i++ returns the non-incremented value, and ++i returns the incremented value, so for example, doing

i = 0;
array[i++];

will access the value at index 0 in the array, while array[++i] will access the value at index 1.

7
  • 4
    +1 for "They do not work the same.". [Too] Many people make this mistake.
    – Phill W.
    Commented Aug 8, 2022 at 11:27
  • 8
    Though you'd expect most modern compilers to be able to automatically optimise i++ into the same operations as ++i if the value of the expression is not actually being used like in the OPs example... Commented Aug 8, 2022 at 11:44
  • 2
    this is the kind of thing an optimizing compiler could reasonably be expected to optimize tho.. for example gcc auto-optimize this on -O2 and -Og but not -O0 - notably the PHP language does not optimize this at all (:
    – hanshenrik
    Commented Aug 8, 2022 at 13:21
  • 5
    Relevant Google-able terms are "prefix operator" (++i) and "postfix operator" (i++) operator. For completeness: there's also an "infix operator" (i + 1).
    – minnmass
    Commented Aug 8, 2022 at 13:48
  • 2
    @user253751 Compilers almost never create wrong code. Any industrial grade compiler will have gone through so much testing and real-world use, it is practically impossible for it to produce code that behaves differently than the unoptimized version. The reason you hear about security issues due to optimization is when C/C++ developers invoke Undefined Behavior, in which case all behavior is undefined, optimizations or not (tho -O3 is much more likely to bring demons). You never hear about security issues with optimization in languages like Java or LuaJIT, with advanced optimizers. Commented Aug 8, 2022 at 18:26

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.