2016-06-10 12 views
1

Nehmen wir an, wir eine Reihe von 10 000 abgeleitete Typen haben wie folgt definiert:Speicherbedarf eines ungenutzten zuweisbaren Array

TYPE type1 
    integer :: i 
    real, dimension(:), allocatable :: real_array 
END TYPE1 

und

type(type1), dimension(1000) :: big_array 

Jetzt haben wir die folgenden Aussagen im Hauptprogramm :

DO j=1,10 
    allocate(big_array(j)%real_array(100)) 
END DO 

von Komponente 11 bis Komponente 1000 big_array, die real_array ist zuweisbar, aber nicht zugewiesen, weil ich es nicht brauche. (Ich nehme die ersten zehn Komponenten nur als Beispiel, aber es kann ein beliebiger Index sein)

Ist es ein Problem in Bezug auf Speichernutzung/Management/Effizienz? Wie groß ist der Speicherbedarf eines "ungenutzten/nicht zugewiesenen zuweisbaren Arrays"?

Antwort

2

Es ist überhaupt kein Problem.

Die zuweisbaren Array-Komponenten real_array werden komplett getrennt an "zufälligen" Stellen im Speicher abgelegt. In der big_array selbst haben Sie nur einige Deskriptoren oder Zeiger dieser Komponenten und die Größe der big_array selbst ist nicht zu groß. Sie sollten sich wahrscheinlich keine Sorgen um ein paar Kilobytes machen.

In Bezug auf die Effizienz könnte das Problem sein (muss aber nicht), dass die Komponenten an zufälligen Standorten sind, aber das wird gleich sein, egal wie groß die big_array ist.

+0

Wenn ich richtig verstehe, durch eine explizite Form 'big_array' von' type1' erklärt, erstelle ich 1000 Zeiger/Deskriptoren von 'real_array' (vernachlässigbar Kilobyte Ich bin damit einverstanden, aber sie existieren), aber diese Zeiger sind nicht referenziert mit Ausnahme der ersten zehn, die auf den zugewiesenen Speicherbereich zeigen, der durch die 'allocate'-Anweisung angegeben wurde, bin ich richtig? – Coriolis

+0

Ja, Sie haben Recht, die Deskriptoren sind da, aber sie sind als nicht zugewiesen/nirgendwo hinweisend markiert. –

+0

Schließlich, um genauer zu sein über den ersten Teil Ihrer Antwort über die "zufällige" Speicherung, meinen Sie, dass jedes 'real_array' seine Komponenten nicht zusammenhängend gespeichert hat? Wenn das explizite Form-Array 'big_array' deklariert wird, werden seine Komponenten zusammenhängend gespeichert? – Coriolis

0

Instanzen eines abgeleiteten Typs haben keinerlei Speicherassoziation und belegen jeweils eine nicht spezifizierte Speichereinheit, die jeweils unterschiedlich ist. Der Fortran-Standard ermöglicht es einem Compiler, die Komponenten eines abgeleiteten Typs in jeder geeigneten Reihenfolge im Speicher neu anzuordnen. Allerdings müssen Sie die Möglichkeit, den abgeleiteten Typen aneinander angrenzend einfach im Speicher abgelegt werden zu erzwingen, verwenden Sie das sequence Stichwort

module type_MyStorage 

    implicit none 
    private 

    type, public :: MyStorage 
    sequence 
    integer :: i=0 
    real  :: a(0:999) 
    end type MyStorage 

end module type_MyStorage 

Es gibt viele Nachteile auf dies zu tun. Sollten in einer solchen Definition andere abgeleitete Typen auftreten, müssen diese ebenfalls Sequenztypen sein, keine typgebundenen Prozeduren oder pointer Komponenten sind erlaubt.

Fazit, Variablen, die als Sequenztypen ohne allocatable Komponenten deklariert sind, können in equivalence Anweisungen und dem gefürchteten common Block erscheinen.

program main 

    use type_MyStorage, only: MyStorage 

    implicit none 

    type (MyStorage) :: foo, bar 

    equivalence (foo, bar) 

    foo%i = 42 
    print *, bar%i 

end program main