调用 时F(argument_expression)
,argument_expression
在为 F 压栈之前进行评估?
例如,在调用 时F(G(H(arg)))
,编译器是否首先为 H 压栈,评估 H,弹出,然后为 G 压栈等?还是先将堆栈推入 F,然后推入 G,然后推入 H,然后弹回 3 层?
另外,一种方法比另一种更快吗?
调用 时F(argument_expression)
,argument_expression
在为 F 压栈之前进行评估?
例如,在调用 时F(G(H(arg)))
,编译器是否首先为 H 压栈,评估 H,弹出,然后为 G 压栈等?还是先将堆栈推入 F,然后推入 G,然后推入 H,然后弹回 3 层?
另外,一种方法比另一种更快吗?
你实际上问了两个正交的问题。
评估的概念站在程序员的有利位置,在这种情况下,C++ 标准对其进行了很好的定义。是的,函数的参数总是在调用该函数之前进行评估。
However, the standard does not specify how the stack should be managed. The compiler is free to take either of the approaches that you've suggested. Of course, it may take a third option, which is to directly inline one or more of your nested functions. There are probably other alternatives.
根据规范,在调用函数可以运行之前对参数进行全面评估。
即:在您的示例中,H(arg)
将在G(result of H(arg))
可以运行之前进行全面评估,等等。
在任何给定时间,您都将拥有一级堆栈深度。
不,它们是按顺序评估的(在这种情况下只有一帧深度)。
这取决于你按 H,G,F 是什么意思 Essential 它以这种方式发生
F 的返回值被推送和一个临时变量然后 G 被推送(它的返回值和一个临时变量)最后所有 H 被推送、评估和弹出。然后是 G,最后是 F。
如果您使用参数表达式来提高性能,它应该会更快。因为它不应该包含任何跳转。