该标准没有指定使用此行对参数进行评估的顺序:
The order of evaluation of arguments is unspecified.
是什么
Better code can be generated in the absence of restrictions on
expression evaluation order
意味着?
要求所有编译器评估函数参数从左到右的缺点是什么?由于这个未指定的规范,编译器执行哪些优化?
解决方法
允许编译器重新排序操作数的评估增加了优化的空间.
这是一个完全弥补的例子,用于说明.
假设处理器可以:
>每个循环的问题1指令.
>在1个循环中执行加法.
> 3个周期执行乘法.
>可以同时执行加法和乘法.
foo(a += 1,b += 2,c += 3,d *= 10);
如果要在没有OOE的处理器上从左到右执行:
Cycle - Operation 0 - a += 1 1 - b += 2 2 - c += 3 3 - d *= 10 4 - d *= 10 5 - d *= 10
现在,如果允许编译器重新排序它们:(并首先启动乘法)
Cycle - Operation 0 - d *= 10 1 - a += 1,d *= 10 2 - b += 2,d *= 10 3 - c += 3
所以6个周期而不是4个周期.
再次,这是完全设计的.现代处理器比这更复杂.但你会得到这个想法.