在Fortran 90中使用2d数组与派生类型数组

时间:2013-08-12 12:43:30

标签: multidimensional-array fortran fortran90 derived-types

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

integer, allocatable :: data(:,:)

或派生类型数组:

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

当然,对于不同大小的阵列,我们没有选择。但是如何在两种情况下管理内存?另外,其中一个是良好的代码实践吗?

2 个答案:

答案 0 :(得分:9)

选择最小化概念距离的实施方案,即头脑中的问题头脑中的问题代码中的解决方案。这种方法的力量随着年龄的增长而增加,代码的年龄(良好的概念设计是未来发展的坚实基础)和您自己的年龄(理解您的代码所需的努力越少,您在精神上足够理解的时间越长它)。

至于关于内存管理方式的问题的非意见决定部分...我天真的期望是大多数情况下大多数编译器会为你的第一个轮廓分配连续的内存,可能不是第二个。但是我不太关心这个问题,我认为你也不应该这样做。我不这样做,建议你不要对引擎盖下的内容感兴趣,而应该更关心第一段中提到的事项。

答案 1 :(得分:4)

通常,您希望使用最适合您问题的最简单数据结构。如果一个2d矩形阵列满足您的需求 - 并且对于大量的科学计算问题,Fortran是一个很好的选择的问题,它确实 - 那么这就是您想要的选择。

2d数组在内存中是连续的,这通常会因缓存和更少的间接级别而更快地访问它; 2d数组还允许你做data = data * 2data = 0.这样的事情,数组数组方法不会 [编辑添加:虽然IanH在评论中指出你可以在这些类型上创建一个已定义的类型和定义的操作以允许这个] 。这些优点足够大,即使你有“乱七八糟的数组”,如果预期的行长度范围不是那么大,将它实现为矩形2d数组有时也是值得考虑的选择。