从理论上讲,C++实现可以并行化两个函数参数的评估吗?

Lig*_*ica 68 c++ language-lawyer

给出以下函数调用:

f(g(), h())
Run Code Online (Sandbox Code Playgroud)

因为函数参数的计算顺序是不确定的(仍然是在C++ 11,据我所知的情况下),可以实现理论上执行g()h()并行?

这种并行化只能起作用g并且h已知是相当微不足道的(在最明显的情况下,仅访问其本体的本地数据)以便不引入并发性问题但是,除了该限制之外,我看不到任何禁止它的内容.

那么,标准是否允许它?即使只是按照as-if规则?

(在这个答案中,Mankarse声称不然;但是,他没有引用标准,而我的通读[expr.call]并没有透露任何明显的措辞.)

Man*_*rse 42

要求来自[intro.execution]/15:

...当调用函数时...调用函数中的每个评估(包括其他函数调用)在执行被调用函数体之前或之后没有特别排序,对于执行该函数的执行是不确定的.被称为函数[脚注:换句话说,函数执行不会相互交错.].

因此,身体的任何执行都g()必须与(即,不重叠)评估不确定地排序h()(因为h()是调用函数中的表达式).

这里的关键点是,g()h()都是函数调用.

(当然,as-if规则意味着不能完全排除这种可能性,但它绝不应该以可能影响程序的可观察行为的方式发生.最多,这样的实现只会改变性能特征.代码.)


Die*_*ühl 16

只要您无法分辨,无论编译器如何评估这些函数都完全取决于编译器.显然,对功能的评估不能涉及对共享的可变数据的任何访问,因为这会引入数据竞争.基本的指导原则是"似乎" - 规则和基本的可观察操作,即访问volatile数据,I/O操作,访问原子数据等.相关部分是1.9 [intro.execution].

  • 我认为*我*很清楚:如果编译器可以告诉它不会违反它的约束,它可以做任何它想做的事情.换句话说:只要你不能分辨它(除了可能测量它所花费的时间)它并行执行这些功能,它是免费的. (4认同)