Усиливают ли вызовы функций в списке аргументов функции стек? - PullRequest
0 голосов
/ 23 июня 2011

При вызове F(argument_expression) оценивается ли argument_expression перед тем, как поместить стек в F?

Например, при вызове F(G(H(arg))) компилятор сначала загружает стек для H, оценивает H, pop, затем поднимает стек для G и т. Д.?Или он сначала выдвигает стек для F, затем для G, затем для H, а затем снова открывает 3 слоя?

Кроме того, один путь быстрее, чем другой?

Ответы [ 4 ]

3 голосов
/ 23 июня 2011

Вы фактически задали два ортогональных вопроса.

Концепция оценка представлена ​​в выгодной позиции программиста и в этом случае хорошо определена стандартом C ++.Да, аргумент функции всегда вычисляется до ее вызова.

Однако в стандарте не указывается, как следует управлять стеком.Компилятор может использовать любой из предложенных вами подходов.Конечно, может потребоваться третий вариант, который заключается в непосредственном включении одной или нескольких ваших вложенных функций.Возможно, есть и другие альтернативы.

1 голос
/ 23 июня 2011

Параметры полностью оцениваются до того, как вызванная функция может быть запущена, по спецификации.

Т.е.: в вашем примере H(arg) будет полностью оценено до того, как G(result of H(arg)) сможет работать, и т. Д.

В любой момент времени вы будете иметь глубину стека в один уровень.

0 голосов
/ 23 июня 2011

Это зависит от того, что вы имеете в виду, нажимая H, G, F По сути, так и происходит

Возвращается возвращаемое значение F, и передается временная переменная, затем G (ее возвращаемое значение и временная переменная), и, наконец, все H выдвигаются, оцениваются и извлекаются. затем G и, наконец, F.

для производительности, если вы используете выражение аргумента, оно должно быть быстрее. так как он не должен содержать скачков.

0 голосов
/ 23 июня 2011

Нет, они оцениваются последовательно (в данном случае только на один кадр).

...