我知道函数参数的计算顺序在 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 之前被插入堆栈。
谢谢
最佳答案
参数求值顺序很大程度上取决于用于调用给定函数的调用约定 - 如果将参数压入堆栈 RTL,通常首先详细说明最右边的参数会更方便。
根据 this表,在 x86 上,在 IA32 上唯一可用的具有 LTR 参数顺序的调用约定是 Borland 上的 fastcall
,但是它在寄存器中传递了前三个整数/指针参数。因此,您应该编写一个接受三个以上整数的函数,将其标记为fastcall
并使用Borland 编译器对其进行编译;在这种情况下,可能除了前三个参数之外的其他参数应该按 LTR 顺序计算。
在其他平台上,您可能会发现其他带有 LTR 参数传递的调用约定(以及可能的 LTR 参数评估)。
请注意,参数传递顺序 <=> 参数评估顺序在逻辑上是绑定(bind)的,但是如果编译器出于某种原因发现最好先评估某些参数,然后再评估其他参数,则标准中没有任何内容阻止它这样做。
关于c++ - 哪个编译器首先评估最左边的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13353783/