调用F(argument_expression)
时,在推送F的堆栈之前评估argument_expression
?
例如,当调用F(G(H(arg)))
时,编译器是否首先将堆栈推送到H,评估H,弹出,然后推送堆栈以获取G等?或者它首先将堆栈推送到F,然后是G,然后是H,然后弹回3层?
另外,一种方式比另一种更快吗?
答案 0 :(得分:3)
你实际上已经提出了两个正交问题。
评估的概念是在程序员的有利位置上进行的,在这种情况下,它是由C ++标准明确定义的。是的,在调用该函数之前总是会计算函数的参数。
但是,该标准未指定应如何管理堆栈。编译器可以自由选择您建议的任何一种方法。当然,它可能需要第三种选择,即直接内联一个或多个嵌套函数。可能还有其他选择。
答案 1 :(得分:1)
根据规范
,在调用函数运行之前完全评估参数 I.e。:在您的示例中,H(arg)
将在G(result of H(arg))
运行之前进行全面评估等。
在任何给定时间你都会有一个级别的深度。
答案 2 :(得分:0)
不,它们是按顺序评估的(在这种情况下只有一帧深)。
答案 3 :(得分:0)
这取决于你推H,G,F是什么意思 必不可少的是这样发生
推送F的返回值,然后推送一个临时变量,然后推送G(其返回值和一个临时变量),最后推送,评估和加速所有H.然后是G,最后是F。
如果使用参数表达式,性能应该更快。因为它不应该包含任何跳跃。