Что происходит, когда я передаю массив в функцию / подпрограмму? - PullRequest
1 голос
/ 02 декабря 2011

Я никогда не думал об этом раньше, но в последнее время меня что-то беспокоит. В Fortran90 (95) говорят, что я создаю действительно большой массив

Integer :: X(1000000)

и затем я пишу функцию, которая принимает этот массив в качестве аргумента. Когда я передаю массив функции (как в myfunc(X)), что именно происходит во время выполнения?

Передается ли весь массив по значению и создается новая копия внутри функции? (дорого)
Или компилятор просто передает какую-то ссылку или указатель на массив? (дешево)

Имеют ли значение размерность массива или объявление функции?

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

В Fortran 90, как и в большинстве других языков программирования, массивы передаются по ссылке (технически это часто ссылка на первый элемент массива).В Fortran 90 значения, не являющиеся массивами, также обычно передаются по ссылке.Поэтому вам не нужно беспокоиться о размере передаваемых параметров, поскольку они не будут скопированы, а будут просто переданы по ссылке.

1 голос
/ 06 декабря 2011

Одна вещь, которую вы не хотите делать, это что-то вроде:

INTEGER :: X(1:1000,1:1000,1:1000)
CALL myRoutine(X(2:999,2:999,2:999))

, где myRoutine по какой-то причине не может работать с границами массива. Он не может передать ссылку на фрагмент массива, поскольку он не является непрерывным в памяти. Таким образом, он создает временный массив и копирует значения из X. Нет необходимости говорить, что это очень медленно. Но у вас не должно быть этой проблемы с одномерным массивом, даже при указании срезов, так как они все еще находятся в памяти.

...