Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Function interleaving in pre C++17

Look at this simple function call:

f(a(), b());

According to the standard, call order of a() and b() is unspecified. C++17 has the additional rule which doesn't allow a() and b() to be interleaved. Before C++17, there was no such rule, as far as I know.

Now, look at this simple code:

int v = 0;

int fn() {
    int t = v+1;
    v = t;
    return 0;
}

void foo(int, int) { }

int main() {
    foo(fn(), fn());
}

With C++17 rules, v surely will have the value of 2 after the call of foo. But, it makes me wonder, with pre-C++17, is the same guaranteed? Or could it be that v ends up 1? Does it make a difference, if instead of int t = v+1; v = t;, we just have v++?

like image 213
geza Avatar asked Dec 23 '22 23:12

geza


1 Answers

Functions calls were not allowed to interleave in previous versions as well.

Quoting from C++11 final draft (n3337)

1.9 Program execution [intro.execution]
...

15. ... When calling a function (whether or not the function is inline), every value computation and side effect associated with any argument expression, or with the postfix expression designating the called function, is sequenced before execution of every expression or statement in the body of the called function. [ Note: Value computations and side effects associated with different argument expressions are unsequenced. —end note ] Every evaluation in the calling function (including other function calls) that is not otherwise specifically sequenced before or after the execution of the body of the called function is indeterminately sequenced with respect to the execution of the called function9.


9) In other words, function executions do not interleave with each other.

Similar wording can be found in the final draft of the C++14 version as well.

like image 145
P.W Avatar answered Jan 03 '23 11:01

P.W