Почему у Fortran POINTER есть TARGET?

Почему спецификация Fortran 90 указывает (5.2.8), что ключевое слово TARGET должно использоваться для связывания с ним POINTER? Почему не каждый тип действителен TARGET?

Например,


INTEGER, POINTER :: px
INTEGER, TARGET :: x
x = 5
px => x
является действительным синтаксисом, но

INTEGER, POINTER :: px
INTEGER :: x
x = 5
px => x
недействителен.

Почему это должно быть?

Ответ 1

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

Ответ 2

Указатели в fortran отличаются от указателей в c. В fortran 90 указателей были снабжены несколькими ограничениями, такими как наличие цели. Это было сделано для решения проблемы скорости и сохранения использования указателя. Хотя один вызов делает выделенные указатели, которые не должны указывать цель. Копайте глубже, и вы их найдете!

Ответ 3

Для лучшей оптимизации компилятора. Когда ваш код работает на скорости ядра 1K-100K, имеет значение.

Btw TARGET не всегда используется. Например, в ситуациях, когда указатель используется для выделения памяти.

...
real, pointer :: p(:), x
...
allocate(p(15))
...
x => p(1:5)
...
nullify(x)
deallocate(p)
...