Compiler Optimization of Argument Evaluation Order in C
The C standard permits compilers to select the evaluation order of function arguments at their discretion. This raises the question of whether real-world implementations exploit this ambiguity to enhance performance.
In most cases, compilers do not optimize argument evaluation order. However, architecture, calling convention, and argument type can influence behavior. On x86 machines, the Pascal calling convention evaluates arguments from left to right, while the C convention (__cdecl) proceeds right to left. Platform-agnostic programs typically consider calling conventions to avoid surprises.
For example, in the classic code snippet:
int i = 0; foo(i++, i++);
The compiler may evaluate i before i in Pascal calling convention, but the opposite may occur in __cdecl. Nonetheless, the result is undefined, and relying on specific evaluation orders is discouraged.
Note that the language standard classifies argument evaluation order as "unspecified," meaning it is not explicitly defined or disallowed. This allows for implementation-dependent behavior and emphasizes the nondeterministic nature of the abstract machine.
The above is the detailed content of Does C Compiler Optimization Exploit Argument Evaluation Order Ambiguity?. For more information, please follow other related articles on the PHP Chinese website!