Я понял, что ваш вопрос касается вещи, называемой оптимизацией возвращаемого значения , и вы в основном думали о простых переменных, без указателя, без распределения. Мой ответ коснется только этого. Я также не буду предполагать никаких дополнительных функций производных типов, таких как полиморфизм и финализация.
Я также предполагаю, что вы используете эту функцию только в простом назначении. Конечно, в общем, функции могут появляться во многих сложных выражениях.
Когда вы возвращаете простую переменную из функции
integer :: ext
ext = func(1)
contains
integer function func(loc) result(res)
res = loc + 1
end function
end
, то концептуально происходит то, что локальная переменная используется для возвращаемое значение res
, и его значение будет скопировано во внешнюю переменную после присвоения.
На практике, если действительно будет использоваться отдельная переменная, она будет размещена в стеке (это ничего не стоит, не просто почти ничего, совсем ничего). Куча может использоваться для больших объектов (в основном массивов), и у компиляторов часто есть настройки для этого, но обычные переменные будут в стеке. Затем, когда функция возвращается, значение копируется в местоположение внешней переменной ext
, а указатель стека сбрасывается (это просто означает, что какая-то другая функция или подпрограмма будет использовать эту память позже).
копирование действительно может чего-то стоить, и им можно пренебречь, а может и не пренебречь. компиляторы очень часто могут оптимизировать это и заставить функцию использовать внешнюю переменную ext
непосредственно для своей переменной результата res
, так что копирование не требуется. Однако, чтобы увидеть, происходит это или не происходит, вам нужно будет проверить машинный код / сборку (или, если доступно, любое промежуточное представление), созданное компилятором. Он может варьироваться в зависимости от уровня оптимизации (-O1
, -O2
, -O3
) и от точного контекста вызова функции в исходном коде.