在表达式中
c = a + b
参考文献a
, b
and c
are to 整个数组. In
c(:,:) = a(:,:) + b(:,:)
参考文献a(:,:)
, b(:,:)
and c(:,:)
are to 阵列部分。这些是不同的事情。
一般来说,数组部分不具有整个数组的属性:如果c
即使这样也是一个指针或可分配数组c(:,:)
不是。当分配时可能发生重新分配时,这一方面最为显着。
In c=a+b
c
可能未分配,并将在响应中分配,但在c(:)=...
c
必须在分配之前进行分配。如果c
按分配时间分配c=...
那么如果出现以下情况,它将被释放:
- 右侧的形状与
c
; or
- 右侧的任何长度类型参数都与
c
; or
-
c
是多态的,并且具有不同的动态类型或右侧表达式的相应种类类型参数不同于c
.
如果存在这样的释放那么c
被重新分配以匹配右侧表达式。
对于数组部分,不存在这样的自由:c(:)
必须适当地匹配右侧表达式,或者必须有适当的可用转换(包括替代定义的赋值)。
从整个数组和数组部分的区别来看,还存在其他方面的问题。
在问题的特定上下文中,数组是显式形状的,那么就不用担心了。
就风格而言,人们可能会认为使用数组部分可以为代码的人类读者增加清晰度,因为“这是一个数组赋值”,或者使用整个数组来帮助编译器优化数组操作。这些之间的平衡取决于具体情况,King 指出相关问题其中考虑了性能方面。
此外,由于上面提到的释放/重新分配,编译器必须对可分配整个数组的内部赋值执行(可能昂贵的)形状/类型/类型参数检查(以确定是否必须发生释放)。使用数组部分意味着这些测试不是必需的。例如,与
c(:,:) = array_expr
程序员保证数组表达式array_expr
形状与c
(如果不是这种情况,则该片段不能是有效的 Fortran)并且编译器不需要运行释放检查。同样,使用它是根据个人情况进行选择。 (另请注意,编译器可能会提供运行时检查,以查看此类表达式是否匹配:如果使用此“技巧”,则应禁用这些检查。)