为什么在c中未指定功能参数的评估顺序?

该标准没有指定使用此行对参数进行评估的顺序:

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&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...