假设您想要一个数组列表,每个数组都具有相同的大小。使用 2D 数组在性能方面是否更好:
integer, allocatable :: data(:,:)
或派生类型的数组:
type test
integer, allocatable :: content(:)
end type
type(test), allocatable :: data(:)
当然,对于不同大小的数组,我们别无选择。但是这两种情况之间的内存是如何管理的呢?另外,其中之一是良好的代码实践吗?
假设您想要一个数组列表,每个数组都具有相同的大小。使用 2D 数组在性能方面是否更好:
integer, allocatable :: data(:,:)
或派生类型的数组:
type test
integer, allocatable :: content(:)
end type
type(test), allocatable :: data(:)
当然,对于不同大小的数组,我们别无选择。但是这两种情况之间的内存是如何管理的呢?另外,其中之一是良好的代码实践吗?
选择最小化您头脑中的问题和代码中的解决方案之间的概念距离的实现。这种方法的力量随着年龄的增长而增加,无论是您的代码年龄(良好的概念设计是未来开发的坚实基础)还是您自己的年龄(理解您的代码所需的努力越少,您的心理能力就越能理解它)。
至于你的问题中关于内存管理方式的非意见决定部分......我天真的期望是,在大多数情况下,大多数编译器会为你的第一个大纲分配连续的内存,并且可能不会第二。但是我不太关心这个来检查,我认为你也不应该这样做。我并不是说你不应该对幕后发生的事情感兴趣,而是你应该更关心第一段中提到的问题。
通常,您希望使用适合您的问题的最简单的数据结构。如果 2d 矩形数组满足您的需求 - 并且对于大量科学计算问题,Fortran 是一个不错的选择,那么它就是您想要的选择。
二维数组在内存中是连续的,由于缓存和间接级别减少,这通常会使访问它更快;2d 数组还允许您执行类似data = data * 2
或data = 0.
数组的数组方法不能执行的操作] . 这些优势足够大,即使您有“参差不齐的数组”,如果预期的行长度范围不是那么大,将其实现为矩形二维数组有时也是值得考虑的选择。