在 Fortran 90 中使用二维数组与派生类型数组

Posted

技术标签:

【中文标题】在 Fortran 90 中使用二维数组与派生类型数组【英文标题】:Using 2d array vs array of derived type in Fortran 90 【发布时间】:2013-08-13 18:48:19 【问题描述】:

假设您想要一个数组列表,每个数组都具有相同的大小。使用二维数组在性能方面是否更好:

integer, allocatable :: data(:,:)

或派生类型的数组:

type test
    integer, allocatable :: content(:)
end type
type(test), allocatable :: data(:)

当然,对于不同大小的数组,我们别无选择。但是这两种情况之间的内存是如何管理的呢?另外,其中之一是良好的代码实践吗?

【问题讨论】:

【参考方案1】:

选择最小化您的思维在头脑中的问题代码中的解决方案之间的概念距离的实现。这种方法的力量随着年龄的增长而增加,无论是您的代码年龄(良好的概念设计是未来开发的坚实基础)还是您自己的年龄(理解您的代码所需的努力越少,您的心理能力就越能理解它)。

关于你的问题中关于内存管理方式的非意见决定部分......我天真的期望是,在大多数情况下,大多数编译器会为你的第一个大纲分配连续的内存,并且可能不是第二个。但是我不太关心这个来检查,我认为你也不应该这样做。我并不是说你不应该对幕后发生的事情感兴趣,而是应该更关心第一段中提到的问题。

【讨论】:

+1 - 我想得越多,“最小化概念距离”可能比“最简单”的一些抽象度量更重要。 就是这样!你必须在可读性和性能之间找到平衡......【参考方案2】:

一般来说,您希望使用适合您的问题的最简单的数据结构。如果 2d 矩形数组满足您的需求 - 并且对于大量科学计算问题,Fortran 是一个不错的选择,那么它就是您想要的选择。

二维数组在内存中是连续的,由于缓存和间接级别减少,这通常会使访问它更快;二维数组还允许您执行 data = data * 2data = 0. 之类的操作,而数组的数组方法没有 [编辑添加:尽管正如 IanH 在 cmets 中指出的那样,您可以创建定义的类型并在这些类型上定义了操作以允许这样做]。这些优势足够大,即使您有“参差不齐的数组”,如果预期的行长度范围不是那么大,将其实现为矩形二维数组有时也是值得考虑的选择。

【讨论】:

在您对数组的乘法和赋值的评论中考虑定义的操作提供的功能。 很公平,但使用内置二维数组确实可以让您获得那些 (a) 更快 (b) 可能更少的临时数组(例如,d=a*b+c),(c)同时在两个维度上切片,所有(d)都是免费的。在某些情况下,做arrays-of-arrays 仍然更有意义,但如果您不需要额外的通用性,使用更简单的情况可能是有意义的。

以上是关于在 Fortran 90 中使用二维数组与派生类型数组的主要内容,如果未能解决你的问题,请参考以下文章

派生类型中的可变长度数组

在派生类型中使用可分配的目标变量

在派生类型中使用可分配的目标变量

Fortran - 可分配派生类型的可分配数组

确定内存中的 Fortran 派生类型大小

Fortran中的“%”是什么意思/做什么?