파생 형식의 배열은 동일한 열 - 주 순서로 저장됩니다.
개별 구성 요소가 저장된 위치가 궁금 할 수 있습니다. 배열 요소의 주소로부터의 오프셋은 지정되지 않으며 순서는 선언 순서와 다를 수 있으며 여러 순서 사이에 다양한 간격이있을 수 있습니다. 그러나 일단 오프셋 값을 (loc()
또는 c_loc()
을 호출하여) 설정하면 해당 배열 내부 또는 그 밖의 다른 위치에 상관없이 해당 유형의 모든 인스턴스에 대해 일정합니다.
그래서, 구성 요소의 순서가 될 수
A(1,1)%i,optional_padding,A(1,1)%j,optional_padding,A(2,1)%i,optional_padding,A(2,1)%j,optional_padding,...
하지만
type :: innerdata
sequence
integer :: i
real :: j
end type innerdata
당신이 순서를 강제로 사용 sequence
유형으로 유형을 정의함으로써도
A(1,1)%j,optional_padding,A(1,1)%i,optional_padding,A(2,1)%j,optional_padding,A(2,1)%i,optional_padding,...
A(1,1)%i,A(1,1)%j,A(2,1)%i,A(2,1)%j,...
그러나 요소 또는 구성 요소에 대한 액세스가 느려질 수 있고 일부 플랫폼에서 일부 바이트 수에 맞춰 정렬되지 않은 메모리 액세스가 허용되어 (매우 느린 액세스로 이어질 수 있기 때문에) 권장하지 않습니다.
유형의 저장소 크기를 알고 싶다면 storage_size()
내장 (Fortran 2008)을 사용하십시오. 결과는 비트 단위입니다. 변수의 주소를 제공하는 비표준이지만 일반적인 공통 확장 인 loc()
을 사용해 볼 수도 있습니다. 두 인접 요소의 loc의 차이는 요소 크기입니다. c_loc()
(Fortan 2003) 및 transfer()
- 결과를 integer(c_intptr_t)
으로 사용하여 동일하게 수행 할 수 있습니다. MPI에서 MPI_Sizeof()
기능도 도움이 될 수 있습니다.
왜 다르게 저장 될 것이라고 생각합니까? –
일부 사용자 정의 형식은 총 크기를 8 바이트 등의 배수가되도록 패딩을 가질 수 있습니다. 이 문제에 영향을주는 컴파일러 설정이 있습니다. – ja72