5

我想知道 fortran 可分配数组的内部存储器表示是什么。

我理解这比原始指针复杂一点,因为形状和等级也必须存储。

我也猜它依赖于实现,因为我在Fortran 2003 标准中找不到信息。

但是,我想知道使用哪种结构来表示可分配数组(即使只有一个编译器)。

我知道这个问题有点宽泛,但任何帮助将不胜感激。

4

1 回答 1

5

可分配数组、指针数组以及假定的形状数组参数都使用数组描述符(也称为涂料向量)进行处理。

任何编译器都可以有自己的数组描述符结构。它可以在编译器手册中找到。但是描述符有一种标准化格式,用于与 C 通信(以及可能与 C 通信的 Fortran 之外的其他软件)。

编译器内部可能不会使用此标准描述符,但可以。如果它也在内部使用,那么编译器在调用 C 互操作过程时不必准备新的描述符。例如,gfortran 计划支持标准描述符“最好作为本机格式”

英特尔在https://software.intel.com/en-us/node/678452中描述了与 C 互操作的不同的本机数组描述符的示例。

C 互操作数组参数的数组描述符结构由技术规范 ISO/IEC TS 29113:2012 关于 Fortran 与 C 的进一步互操作性定义,该规范将成为 Fortran 2015 的一部分。

在 C 头文件ISO_Fortran_binding.h中定义了一个 C 结构,该结构使用 Fortran 描述符(假定的形状、指针或可分配的)定义。

它看起来如下(来自IBM 网站,某些细节可能是特定于编译器的):

CFI_cdesc_t 
    A type definition that describes a C descriptor. It contains the following structure members:

void *base_addr
    The base address of the data object that is described. For deallocated allocatable objects, base_addr is NULL. 
size_t elem_len

        For scalars: The size in bytes of the data object that is described.
        For arrays: The size in bytes of one element of the array.

int version
    The version number of the C descriptor. Currently, the only valid value is available by using the CFI_VERSION macro.
CFI_attribute_t attribute
    The attribute code of the C descriptor. For the valid values for attribute, see Table 1.
CFI_type_t type
    The type code of the C descriptor. Describes the type of the object that is described by the C descriptor. For the valid values for type, see Table 2. 

CFI_rank_t rank
    The rank of the object that is described by the C descriptor. Its value must be in the range 0 ≤ rank ≤ CFI_MAX_RANK. A value of 0 indicates that the object is a scalar. Otherwise, the object is an array.
CFI_dim_t dim[]
    An array of size rank that describes the lower bound, extent, and stride of each dimension.

There is a reserved area between rank and dim. The size of the reserved area is 12 words in 32-bit mode and 9 words in 64-bit mode.

引用的CFI_类型也在ISO_Fortran_binding.h标头中定义。

因此,即使此描述符可能与您的编译器内部使用的不完全相同,它也是一个很好的例子,说明了人们应该在 Fortran 数组描述符中期望什么样的数据组件。

但是,请注意 gfortran,一个非常常见的编译器,还没有使用这种类型的描述符。只有一个带有新描述符的实验版本,当前的描述符在手册中有描述。Fortran 与 C的进一步互操作性中也提到了该状态。

于 2017-02-24T17:15:09.777 回答