Стоимость использования функций на фортране (или любом другом языке)

Скажем, у меня есть очень большой массив verybigvariable

И я определил функцию, которая выполняет некоторые операции, подобные этой.

function myfunc(var) result(res)
real:: var(:,:,:),res

...
...
...

end function myfunc

Мой вопрос в том, что когда я вызываю эту функцию вот так

myvar=myfunc(verybigvariable)

что случается? дублирует ли он мою переменную, чтобы во время выполнения функции она занимала 2-кратное пространство в оперативной памяти? Если да, то как я могу предотвратить это? (Я знаю, что в простой программе я могу определить функцию без каких-либо параметров и заставить ее использовать существующие переменные, но если я программирую модуль, кажется, мне нужно включить параметр в определение)


person Hasan    schedule 24.03.2013    source источник
comment
Я могу говорить только за C, но в C всегда копируются параметры. Вы можете решить эту проблему с помощью указателей, которые имеют фиксированный небольшой размер для каждой системы. Кроме того, в C массив по умолчанию передается как указатель, но опять же, я не могу говорить о фортране.   -  person antonijn    schedule 24.03.2013
comment
Спасибо, это, вероятно, то же самое на любом языке или на большинстве из них. Я узнаю об указателях.   -  person Hasan    schedule 24.03.2013
comment
О, эта функция автоматического указателя для массивов очень хороша. Я надеюсь, что в Фортране это тоже есть.   -  person Hasan    schedule 24.03.2013
comment
Я только что нашел кое-что интересное. При поиске в Google указателей fortran первое попадание сказало: Как вы помните, Fortran передает функции адрес аргумента..., поэтому в fortran кажется, что параметры всегда передаются с использованием указателей.   -  person antonijn    schedule 24.03.2013
comment
@antonijn Круто! пожалуйста, опубликуйте это как ответ, чтобы любой мог найти решение, а также я могу вознаградить его :)   -  person Hasan    schedule 24.03.2013


Ответы (2)


Стандарт языка Fortran не определяет, как передаются аргументы. Обычно в интересах эффективности компилятор не делает копию, а передает адрес аргумента. Будут случаи, когда компилятор Фортрана должен сделать копию. Например, фактический аргумент — несмежный массив, но процедура ожидает непрерывный аргумент. Компилятору придется исправить несоответствие, создав непрерывную копию для передачи в процедуру. Если процедура изменяет этот аргумент, значения должны быть скопированы обратно в исходный аргумент.

person M. S. B.    schedule 24.03.2013

В фортране кажется, что параметры передаются по ссылке. Это означает, что передается только адрес переменной, после чего функция может получить доступ к переменной по этому адресу.

Так что нет, массив не копируется, передается только адрес массива. Накладные расходы для этого будут либо 32 бита для 32-битной системы, либо 64 бита для 64-битной системы.

У меня нет опыта работы с Fortran, и это только то, что я смог выяснить с помощью поиска в Google, поэтому, если у кого-либо из программистов Fortran есть какие-либо замечания, пожалуйста, не стесняйтесь редактировать/комментировать.

person Community    schedule 24.03.2013