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

时间:2012-11-13 00:16:19

标签: c++ compiler-construction operator-precedence

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

//简单明显的一个。

callFunc(getA(),getB());

可以等效

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

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

这是完美的精致&我想大多数人都知道这一点。

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

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

由于

1 个答案:

答案 0 :(得分:6)

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

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

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

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