c++ - 为什么在 C++ 中未指定函数参数的评估顺序?

标签 c++ operator-precedence

标准没有用这一行指定参数的评估顺序:

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/

相关文章:

c++ - 面试题; Effective C++ 的主题是什么?

c++ - 你什么时候会使用数组而不是 vector/字符串?

c++ - 无法从 MFC DLL 创建模式对话框

c++ - std::invoke(C++1z) 如何工作?

c++ - 类数据成员的销毁顺序?

c++ - C++ 运算符如何工作

c++ - 如何(优雅地)读取列具有不同类型的文件并适本地存储列?

c++ - 如果检查 null 然后检查 C++ 中的其他条件,复合是否总是安全的?

mysql SELECT 超过 1 个或

尽管右侧有一个一元运算符,但 Java 的逻辑 OR 运算符不计算右侧?