2016-06-10 111 views
1

假設我們定義爲10種000派生類型的數組:內存佔用

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

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

現在,我們已經在主程序下面的語句:

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

從部件11到部件big_array 1000中,real_array是可分配的,但未分配,因爲我不需要它。 (我以前十個組件爲例,但它可以是任何下標)

這是內存使用情況/管理/效率問題嗎? 「未使用/未分配的可分配數組」的內存佔用是多少?

回答

2

這根本不是問題。

可分配數組組件real_array完全分開存儲在內存中的「隨機」位置。

big_array本身你只有一些描述符或這些組件的指針和big_array本身的大小不是太大。你可能不應該擔心幾千字節。

就效率而言,問題可能是(但並非必須),即組件位於隨機位置,但無論big_array有多大,它們都是相同的。

+0

如果我理解正確的話,通過聲明明確形'big_array' type1'的',我創建1000個三分球/ real_array'的'描述符(可忽略千字節我同意,但是他們都存在),但這些指針不除了前10個指向由'allocate'語句指定的分配內存空間之外的引用,我正確嗎? – Coriolis

+0

是的,你是正確的,描述符在那裏,但它們被標記爲未分配/不指向任何地方。 –

+0

最後,關於「隨機」存儲的答案的第一部分更具體一點,你的意思是說,每個「real_array」的組件都是非連續存儲的?通過聲明顯式形狀數組big_array,它的組件是否連續存儲? – Coriolis

0

派生類型的實例沒有任何存儲關聯,每個實例都佔用一個不同的未指定的存儲單元,每個存儲單元在每種情況下都不相同。 Fortran標準允許編譯器以任何方便的順序在內存中重新排列派生類型的組件。但是,你有能力迫使派生型被連續存儲在內存中,只需使用sequence關鍵字

module type_MyStorage 

    implicit none 
    private 

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

end module type_MyStorage 

有很多缺點,以這樣做。如果其他派生類型出現在這樣的定義中,它們也必須是序列類型,不允許使用類型綁定程序或組件。

Upshot,聲明爲序列類型的變量沒有allocatable組件可以出現在equivalence語句和可怕的common塊中。

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