2

関数パラメーターが評価される順序はC++では指定されていないことを知っています。以下を参照してください。

//単純な明白なもの。

callFunc(getA(),getB());

これと同等にすることができます:

int a = getA();
int b = getB();
callFunc(a,b);
Or this:

int b = getB();
int a = getA();
callFunc(a,b);

これは完璧です&私はほとんどのpplがこれを知っていると思います。

しかし、私はVC10、gcc 4.72を試しましたが、それらはすべてbを最初に(右から左に)評価します。つまり、bが最初にスタックフレームにプッシュされ、次にaがプッシュされます。

最初に評価するために、上記のコードをどのc ++コンパイラで作成する必要があるのか​​疑問に思っていますか?したがって、bの前にスタックにプッシュされます。

ありがとう

4

1 に答える 1

6

パラメーターの評価順序は、特定の関数を呼び出すために使用される呼び出し規約に大きく依存します。パラメーターがスタックRTLにプッシュされる場合は、通常、右端のパラメーターを最初に作成する方が便利です。

この表によると、x86では、スタック上のLTRパラメーターの順序でIA32で使用できる唯一の呼び出し規約はfastcall、Borlandにありますが、レジスターの最初の3つの整数/ポインターパラメーターを渡します。したがって、3つ以上の整数を受け取る関数を記述し、それをマークしfastcallて、Borlandコンパイラでコンパイルする必要があります。その場合、おそらく最初の3つ以外の他のパラメーターはLTR順に評価する必要があります。

他のプラットフォームに行くと、おそらくLTRパラメーターの受け渡し(そしておそらくLTRパラメーターの評価)を伴う他の呼び出し規約が見つかるでしょう。

パラメーターの受け渡し順序<=>パラメーターの評価順序は論理的にバインドされていることに注意してください。ただし、何らかの理由でコンパイラーが、あるパラメーターを他のパラメーターよりも先に評価する方がよいと判断した場合、標準にはそれを妨げるものはありません。

于 2012-11-13T00:26:37.187 に答える