현대 Fortran에서 서브 루틴이 인수로 전달 된 배열을 채우는 것과 동일한 성능을 가진 함수에서 배열을 반환 할 수 있습니까?Fortran 2008 : 함수 반환 값은 어떻게 반환됩니까?
예 : 간단한 예로서 여기에서 스택 리턴 된 배열을 폐기하기 전에, 함수 반환 값으로부터 값을 복사 할 광고 C = FUNC()
PROGRAM PRETURN
INTEGER :: C(5)
C = FUNC()
WRITE(*,*) C
CALL SUB(C)
WRITE(*,*) C
CONTAINS
FUNCTION FUNC() RESULT(X)
INTEGER :: X(5)
X = [1,2,3,4,5]
END FUNCTION FUNC
SUBROUTINE SUB(X)
INTEGER :: X(5)
X = [1,2,3,4,5]
END SUBROUTINE SUB
END PROGRAM PRETURN
. 서브 루틴 버전 CALL SUB(C)
은 C
을 직접 채우므로 여분의 대처 단계와 임시 배열과 관련된 메모리 사용을 피할 수 있지만 SUM(FUNC())
과 같은 표현에서 사용은 불가능합니다. 그러나 경우
C
의 기본 포인터를 변경하여 간단하게 할당 할 수있는 힙의 모든 배열을 할당하기로 결정했습니다. *
등인가 일반적인 컴파일러에 의한 최적화 또는 성능 오버 헤드없이 기능적 의미를 얻기위한 다른 방법이 있습니까?
* 할당 가능한 배열이 더 명확 할 수도 있지만 컴파일러 지원 문제가 발생합니다. Intel Fortran은 기본적으로 다른 크기의 배열을 할당 할 때 배열을 (재) 할당하지 않지만 ALLOCATE(C, SOURCE=FUNC())
문을 사용하여 동일한 효과를 허용합니다. Gfortran은 할당시 자동 할당을 수행하지만 모양은 SOURCE
인수에서 파생되는 ALLOCATE
문을 방지하는 버그가 있으며 수정 사항은 아직 이진 릴리스에 포함되지 않았습니다.
언제든지 포트란에 대한 "이동 할당"의미 설정 시도를 알고 있습니까? 기본적으로 그렇게하는 것에 반대하여 좋은 점을 지적했지만, 함수/반환 값에 대한 명시 적 속성으로 구현 될 수있는 것처럼 보입니다. – kdb
표준위원회에서 논의 된 내용을 들어 보지 못했습니다 (2008 년부터 회원으로 활동 해 왔습니다). 서브 루틴 호출로 원하는 것을 성취 할 수 있기 때문에 불필요한 복잡성으로 보입니다. –