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].