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);

这很好,我想大多数人都知道这一点。

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

我只是想知道我应该尝试使用哪个 c++ 编译器来使上面的代码评估第一个?所以 a 在 b 之前被推入堆栈。

谢谢

4

1 回答 1

6

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

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

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

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

于 2012-11-13T00:26:37.187 回答