2013-01-07 52 views
1

我無法在任何地方找到它,即使它可能是微不足道的,我想確保我已經很好理解。我有4個問題(嚴格相關的):派生類型(在Fortran中)佔用多少個字節?這些地點是連續的嗎?還有一個指向派生類型的指針?

1)如果我在FORTRAN限定派生類型是這樣

TYPE :: node 
     INTEGER :: int 
     REAL :: REALfirst 
     REAL :: REALsecond 
    END TYPE 
    TYPE(node) :: var 
    allocate(var) 

上述分配後,它佔用4個字節中對2單個整數和其它8-精度實數,總共12字節。它們是否連續位於記憶中?計算機如何存儲有關變量類型的信息?我想它需要一些額外的內存來保存它。

2)如果在上述的例子,而不是

TYPE(node) :: var 

我會寫:

TYPE(node),POINTER :: var 

我想,如果我編譯一個32位的可執行ALLOCATE語句將分配相同量的如上例所示。這是對的嗎?

3)現在,讓我們假設我聲明類型

TYPE :: node 
     INTEGER :: int 
     TYPE(node), POINTER :: BEFORE 
     TYPE(node), POINTER :: AFTER 
    END TYPE 
    TYPE(node) :: var 
    allocate(var) 

這裏(如果32位編),將分配用於對於2個指針的整數和其他8 4字節,總共12個字節。這是正確的嗎?計算機又如何存儲有關變量類型的信息?在示例(3)中,如果我現在編寫ALLOCATE(var%BEFORE),則將其他12個字節分配給具有派生類型節點的變量,以及爲指針var分配的整數類型的4個字節%BEFORE(請參見示例3)現在已釋放,是否正確?

THANKS A.

+1

我不認爲這個問題值得這麼多downwotes。海報可能有一些誤解,但他的問題是合法的。 –

回答

3

1)這不是由Fortran標準覆蓋。 realinteger不必是4個字節寬。確保通過指定它們的精度。如果您不關心數字精度,但是關於字節數,請這樣做

!In Fortran 2008 
use iso_fortran_env 

or 

!In Fortran 95 
integer,parameter :: int32 = selected_int_kind(9) 
integer,parameter :: real32 = selected_real_kind(p=6,r=37) 

and 

    TYPE :: node 
     INTEGER(int32) :: int 
     REAL(real32) :: REALfirst 
     REAL(real32) :: REALsecond 
    END TYPE 

允許編譯器插入任何想要的填充。如果將變量與4,8甚至更多字節混合,這很可能會發生。要禁止任何填充使用SEQUENCE

2)分配的內存將是相同的。編譯器也使用一些數據結構(它可能只是一個地址,但不一定)用於簿記。

3)我認爲簿記數據結構存儲在數據類型中。它可能只是一個地址。

4)指針數據結構可以是4個字節,但也可以更多。但更重要的一點是,他們沒有被釋放。您必須知道在堆中找到分配空間的位置,並使用該指針。無論您是使用此指針分配新數據還是指向現有數據,都無關緊要。

請注意,派生類型的位大小在運行時不能改變,它是固定的。另一個問題是多態變量,但它們必須爲此動態分配。

+0

非常感謝。在第(4)點有一個錯字,我剛剛編輯它,我用節點%BEFORE替換AFTER。我在說的是:如果我們認爲第(3)點正在做你和我說的話,指針節點%BEFORE佔用4個字節(整數指向一個未定義的內存位置)。如果我現在編寫ALLOCATE(var%BEFORE),那麼堆中會分配12個字節,並且這4個字節是否被釋放?因爲如果我寫了var%BEFORE => var2(var2是類型節點的另一個變量)而不是ALLOCATE(var%BEFORE),那麼在這種情況下,我將var2的12個字節和var%BEFORE的4個字節對嗎? – Lupocci

+0

看到我上面的編輯。 –

+0

(int32/real32和朋友已添加到F2008中的iso_fortran_env。) – IanH

相關問題