现代Fortran中数组的连续性



我正在阅读" Modern Fortran explained ";(2018年版)。它在第24页说:

大多数实现实际上是按照数组元素顺序将数组存储在连续存储器中,但是我们要强调的是,标准并没有这样的要求。

我相信这可以追溯到旧的fortran 77(或更早)。给定一个声明

real, dimension(5,5) :: a

我的理解是,标准不要求这个数组是连续的。这与本书第7.18.1节第140页所说的一致:

…Fortran标准避免指定数组是否连续,因为它占用了顺序的内存位置,中间没有未占用的空间。

然后书继续(仍然是p140):

根据标准,下列任何数组都被认为是连续的:

  • 具有连续属性的数组;
  • 不是指针或假定形状的整个数组(命名为数组或数组组件,不作进一步限定);
  • 我理解第一个标准;但我对第二个标准感到困惑。这与之前的声明不一致,即fortran标准不要求按数组元素顺序将数组存储在连续存储中?现代fortran是否偏离了这种范式?还是说以上引用的内容并不矛盾,原因超出了我对这个话题的理解?在上面的例子中,阵列a是否需要是连续的?

    语言标准根据标准所描述的概念指定了必须发生的事情(语句按一定顺序执行,变量用值定义,内容写入称为"文件"的东西),但它没有说明这些事情如何发生/如何实现。

    可能有一种明显的实现方法,甚至可能只有一种实用的方法,但是,标准仍然没有规定实现方法。

    标准甚至不需要一个"Fortran处理器"。成为一个电子设备。

    实际上,一个"连续数组"是一个相当安全的假设。(Fortran标准语言术语)将通过表示数组元素的值的字节来实现,这些值挨个存储在RAM中,但这是实现细节,而不是语言标准要求。

    对于程序员来说,了解可能的实现方法是很方便的,特别是在调试或理解性能方面,但是实现和规范不应该混为一谈。

    这里有两种不同的相邻概念。

    在Fortran意义上,连续意味着(Fortran 2018, 3.41):

    数组元素的顺序不被其他数据对象分隔

    这个相邻的概念允许"填充";如果存储在内存中的数组元素之间有这种可能性。相邻性是指A(1)A(2)之间没有物体。

    也就是说,标量可能占用一些空间,但作为数组的元素,同一对象可能占用更多的空间。如(F2018 16.9.184,注1)所示:

    数组元素可能比单独的标量需要更多的位来存储,因为任何硬件强加的数组元素对齐要求可能不适用于简单的标量变量。

    关于哪些数组被认为是连续的描述引用了这种连续意义。在问题的第二句引语中,不强制要求的是相邻的不同概念。

    从你的例子

    real, dimension(5,5) :: a
    

    我们确实有一个连续数组a:它是一个完整的数组,不是指针,也不是假设形状。元素之间可能仍有一定程度的填充。

    最新更新