gpt4 book ai didi

arrays - 使用 move_alloc 和源分配扩展可分配数组

转载 作者:行者123 更新时间:2023-12-02 08:24:02 26 4
gpt4 key购买 nike

在下面的代码中,我试图通过首先分配一个更大的临时数组 buf(:) 来增加 a(:) 的长度,复制a(:)的内容到buf(:),然后使用move_alloc()buf<复制数组描述符a:

program main
implicit none
integer, allocatable :: a(:), buf(:)

allocate( a(2) )
a = [1,2]

allocate( buf( 4 ), source= 0 ) !! (1)
buf( 1:2 ) = a( 1:2 ) !! (2)

! allocate( buf( 4 ), source= a ) !! (3)

! deallocate( a ) !! (4)
call move_alloc( buf, a )

print *, "a(:) = ", a(:)
end

在这里,我有两个问题:首先,在第 4 行中,是否有必要在调用 move_alloc() 之前显式释放 a(:)...?即使没有第 4 行,gfortran 和 Intel Fortran 似乎也能正常工作,但这是否意味着 move_alloc() 自动释放 a(:) 如果它是预分配的?其次,我们能否用第 3 行替换第 1 行和第 2 行,即使用具有不同长度数组的源分配?我对此进行了试验,gfortran 和 Intel Fortran 似乎都接受了(显然)正确的结果。

最佳答案

从关于 move_alloc 的 Fortran 标准 (2008, 13.7.118) 中,我们有参数 to 的详细信息(子例程的第二个参数)

It is an INTENT (OUT) argument

这与您在 gfortran manual 链接中给出的描述相匹配.

对于任何其他具有intent(out)allocatable 属性的虚拟参数,与to 关联的实际参数将被释放在调用子例程 move_alloc 时。也就是说,您不需要自己释放 a

关于来源分配,我们already know被分配的数组必须与源数组一致,这样写

allocate(buf(4), source=a)  ! a is the same rank as buf, but extent 2

无效,和

一样
allocate(buf(4), source=a(1:2))

是。

然而,虽然有一些关于来源分配的编号限制,但其中一个不包含此符合性要求。因此,您的编译器不需要检测您的代码是否符合规范。

自然地,编译器允许提示,正如您在使用a(1:2) 作为源代码时看到的那样。在某种程度上,与 a 的情况相比,在编译时更容易看出 extent 4 的数组不符合 a(1:2)。例如,您可以尝试使用 a(1:SIZE(a)) 来查看您的编译器在此类测试中花费了多少精力。

作为最后的评论,当然可以用单一来源的分配替换您的第 1 行和第 2 行:

allocate(buf, source=[a,0,0])  ! Buf is 2 longer than a

但这并不一定“更好”。

关于arrays - 使用 move_alloc 和源分配扩展可分配数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33906724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com