0

调用 时F(argument_expression)argument_expression在为 F 压栈之前进行评估?

例如,在调用 时F(G(H(arg))),编译器是否首先为 H 压栈,评估 H,弹出,然后为 G 压栈等?还是先将堆栈推入 F,然后推入 G,然后推入 H,然后弹回 3 层?

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

4

4 回答 4

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.

于 2011-06-22T22:54:47.207 回答
1

根据规范,在调用函数可以运行之前对参数进行全面评估。

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

在任何给定时间,您都将拥有一级堆栈深度。

于 2011-06-22T22:21:33.220 回答
0

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

于 2011-06-22T22:17:40.913 回答
0

这取决于你按 H,G,F 是什么意思 Essential 它以这种方式发生

F 的返回值被推送和一个临时变量然后 G 被推送(它的返回值和一个临时变量)最后所有 H 被推送、评估和弹出。然后是 G,最后是 F。

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

于 2011-06-22T22:27:52.037 回答