函数参数列表中的函数调用会加深堆栈吗?

时间:2011-06-22 22:15:58

标签: c++ inline callstack calling-convention

调用F(argument_expression)时,在推送F的堆栈之前评估argument_expression

例如,当调用F(G(H(arg)))时,编译器是否首先将堆栈推送到H,评估H,弹出,然后推送堆栈以获取G等?或者它首先将堆栈推送到F,然后是G,然后是H,然后弹回3层?

另外,一种方式比另一种更快吗?

4 个答案:

答案 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。

如果使用参数表达式,性能

应该更快。因为它不应该包含任何跳跃。