4

これは、理論的には、C++実装が2つの関数の引数の評価を並列化できるかどうかのフォローアップのようなものです。

次のC++11プログラムがあるとします。

#include <cstdio>
using std::printf;
int g() { printf("1\n"); printf("3\n"); return 2; }
int h() { printf("2\n"); printf("4\n"); return 3; }
void f(int a, int b) { printf("%i\n", a+b); }
int main() { f(g(), h()); }

確かに、次の出力が観察可能です。

1 3 2 4 5
2 4 1 3 5

1 2 3 4 5はどうですか?

(私が知る限り、唯一の制約は、1が3の前にシーケンスされ、2が4の前にシーケンスされ、3と4の両方が5の前にシーケンスされることです。)

4

1 に答える 1

8

C ++ 03は、関数の呼び出しはインターリーブしないと規範的に言っていました。C ++ 11は、規範的に次のように述べています

呼び出された関数の本体の実行の前後に特に順序付けられていない呼び出し元の関数(他の関数呼び出しを含む)のすべての評価は、呼び出された関数の実行に関して不確定に順序付けられます。

これを禁止するには、両方で十分です。

于 2012-11-18T19:46:36.860 に答える