繁体   English   中英

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

[英]Do function calls within a function's argument list deepen the stack?

调用F(argument_expression) ,是否在为F压栈之前评估了argument_expression

例如,当调用F(G(H(arg))) ,编译器是否首先将堆栈压入H,评估H,弹出,然后将堆栈压入G,依此类推? 还是首先将堆栈压入F,然后压入G,然后压入H,然后再弹出3层?

另外,一种方法是否比另一种更快?

您实际上已经问了两个正交的问题。

评估的概念紧紧抓住程序员的优势,在这种情况下,C ++标准对此进行了很好的定义。 是的,函数的参数始终在调用该函数之前进行求值。

但是,该标准未指定应如何管理堆栈。 编译器可以自由采用您建议的任何一种方法。 当然,可能需要第三种选择,即直接内联一个或多个嵌套函数。 可能还有其他选择。

根据规范,对参数进行全面评估,然后才能运行被调用的函数。

即:在你的例子中, H(arg)将全面评估之前G(result of H(arg))可以运行等

在任何给定时间,您都将拥有一个层次的堆栈深度。

不,它们是按顺序评估的(在这种情况下,只有一帧深)。

这取决于您按下H,G,F是什么意思

推入F的返回值,然后压入一个临时变量,然后推入G(其返回值和临时变量),最后所有H都被推入,求值并弹出。 然后是G,最后是F。

为了提高性能,如果使用参数表达式,它应该更快。 因为它不应包含任何跳转。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM