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

标签 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++ 编译器? 所以 a 在 b 之前被插入堆栈。

谢谢

最佳答案

参数求值顺序很大程度上取决于用于调用给定函数的调用约定 - 如果将参数压入堆栈 RTL,通常首先详细说明最右边的参数会更方便。

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

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

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

关于c++ - 哪个编译器首先评估最左边的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13353783/

相关文章:

c++ - 编译 Spirit 示例时出错

java - 我应该使用 javac -O 选项进行优化吗?

c++ - 利用容器的移动语义和元素初始化

c++ - 用户定义转换中的模板参数类型推导

C++如何在字符后获取子字符串?

compiler-construction - Mindustry Game CPU 架构的最简单编译器

c++ - Debug模式下的内存泄漏

c++ - 函数参数的评估顺序

perl - 在 Perl 中分配和测试定义时理解优先级

C++ 服务器连接问题