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之前被推到了堆栈.
谢谢
参数评估顺序基本上取决于用于调用给定函数的调用约定 - 如果参数被推送到堆栈RTL上,通常更方便的是首先详细说明最右边的参数.
根据这个表,在x86上,在堆栈fastcall上具有LTR参数顺序的IA32上唯一可用的调用约定是在Borland上,但是它会传递寄存器中的前三个整数/指针参数.所以你应该写一个函数,它需要三个以上的整数,标记为fastcall并用Borland编译器编译它; 在这种情况下,可能除了前三个参数之外的其他参数应按LTR顺序进行评估.
在其他平台上,你可能会发现LTR参数传递的其他调用约定(可能还有LTR参数评估).
请注意,参数传递顺序<=>参数评估顺序是逻辑绑定的,但如果由于某种原因编译器发现最好在其他参数之前评估某个参数,则标准中没有任何内容阻止它这样做.