2014-02-15 111 views
0

當我們從具有通過程指針,是在每種情況下複製的實際過程(子程序/功能)中的數據類型(類)創建多個實例?或者只是複製指針?程序拷貝

例如,考慮下面的代碼可以編譯和運行正常。

 
module mod2 
    implicit none 

    private 

    type class_type 
    integer :: a, b, c 
    contains 
    procedure :: add => add_it 
    end type class_type 

    public :: class_type 

contains 

    subroutine add_it(this) 
    implicit none 
    class(class_type), intent(inout) :: this 

    this%c = this%a + this%b 

    end subroutine add_it 

end module mod2 

program tester 
    use mod2 
    implicit none 

    type(class_type), dimension(10) :: objs 

    objs(:) = class_type(1, 2, 0) 

end program tester 

是子程序add_it在每個從數據類型class_type創建的10個對象的複製?或者子程序add_it的指令集存儲在某處並指向它,即"procedure :: add => add_it"複製到每個對象中?

回答

1

通常既不。注意這是非常多實現特定的 - 我在下面描述的是典型的,但不同的處理器可能會以不同的方式做事。

請注意,在您的示例中沒有過程指針。 class_type類型具有綁定。如果class_type有一個過程指針,事情就不同了。

用於綁定的典型實現是編譯器創建的機器水平指針的表,與該過程中的代碼的一個條目爲每個特異性結合,用指針指向。爲程序中的每種類型創建一個表格(有時稱爲「vtable」,來自用於C++和類似語言的虛擬成員函數的類似技術)。

對於多態性對象(具有CLASS聲明的東西),編譯器然後創建具有一個機器級指針爲動態(運行時)的對象的類型的相關表格的描述符。該指針有效地指示對象的動態類型,並可用於構造如SELECT TYPE以及諸如SAME_TYPE_AS之類的調用。如果你有一個多態數組,編譯器最初通常只會爲整個數組創建一個描述符,因爲數組中的各個元素都必須具有相同的動態類型。

當你調用一個多態對象的約束力,編譯器將跟隨指針到虛函數表,那麼相關指針查找的程序結合。

對於非多態對象(使用TYPE聲明的事物),不需要這樣的描述符或指針解引用,因爲動態和聲明類型總是相同的,編譯器在編譯時知道聲明的類型和編譯器知道的內容,該程序將被調用。

如果你有一個地方非多態性實際參數與多態僞參數相關聯的過程調用,那麼編譯器通常會創建必要的描述符製作過程調用的一部分。類似地,將多態數組元素傳遞給採用多態標量的過程。

代碼的主要程序不包含多態實體,並調用沒有手續,所以可能沒有任何機器的指針回到虛函數表。

過程指針組件(在類型聲明的CONTAINS之前聲明的PROCEDURE(xxx), POINTER :: yyy組件)對於每個對象(對於數組中的每個元素都不相同)都可以不同。在這種情況下,典型的實現是將機器級指針存儲到相關過程的代碼中(或者如果過程指針組件未關聯,則爲空指針)。