2014-02-15 68 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组件)对于每个对象(对于数组中的每个元素都不相同)都可以不同。在这种情况下,典型的实现是将机器级指针存储到相关过程的代码中(或者如果过程指针组件未关联,则为空指针)。