哪个编译器首先评估最左边的参数

Gob*_*0st 2 c++ compiler-construction operator-precedence

我知道在C++中未指定函数参数的评估顺序,见下文,

//简单明显的一个.

callFunc(getA(),getB());
Run Code Online (Sandbox Code Playgroud)

可以相当于:

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

int b = getB();
int a = getA();
callFunc(a,b);
Run Code Online (Sandbox Code Playgroud)

这是完美的,我认为大多数人都知道这一点.

但我已经尝试过VC10,gcc 4.72并且他们都首先评估b(从右到左),这意味着b首先被推入堆栈帧然后a.

我只是想知道哪个c ++编译器应该尝试使上面的代码首先评估?所以在b之前被推到了堆栈.

谢谢

Mat*_*lia 6

参数评估顺序基本上取决于用于调用给定函数的调用约定 - 如果参数被推送到堆栈RTL上,通常更方便的是首先详细说明最右边的参数.

根据这个表,在x86上,在堆栈fastcall上具有LTR参数顺序的IA32上唯一可用的调用约定是在Borland上,但是它会传递寄存器中的前三个整数/指针参数.所以你应该写一个函数,它需要三个以上的整数,标记为fastcall并用Borland编译器编译它; 在这种情况下,可能除了前三个参数之外的其他参数应按LTR顺序进行评估.

在其他平台上,你可能会发现LTR参数传递的其他调用约定(可能还有LTR参数评估).

请注意,参数传递顺序<=>参数评估顺序是逻辑绑定的,但如果由于某种原因编译器发现最好在其他参数之前评估某个参数,则标准中没有任何内容阻止它这样做.