标准没有用这一行指定参数的评估顺序:
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 个周期。
同样,这完全是人为设计的。现代处理器比这复杂得多。但你明白了。
关于c++ - 为什么在 C++ 中未指定函数参数的评估顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12540418/