fortran - Fortran intent(inout) 是否传递值的副本,或指向 RAM 地址的指针/引用?

标签 fortran argument-passing subroutine

正如标题所述,我想知道 Fortran intent(inout) 是否传递值的副本,或指向 RAM 地址的指针/引用?我需要知道这一点的原因是我需要传递一个(相对)大数据矩阵。如果它创建了一个会导致我出现问题的本地副本。谢谢!

最佳答案

Fortran 没有指定函数和子例程参数如何传递的细节,但它确实要求如果一个过程修改了 intent(out)intent(inout)参数,则在过程返回后,调用者将可以看到更改。编译器通过引用传递参数来实现这一要求是很常见的,但这不是唯一的可能性——复制输入/复制输出是主要的替代方法。

您通常可以依靠编译器来实现最快的行为,它可以确定是正确的,这通常是通过引用传递。但是,在某些情况下这不起作用,例如将非连续数组部分传递给假定大小的虚拟参数,并且有时复制输入/复制输出更快(可能在某些大型多处理器系统上分段内存架构)。

最重要的是,尽管您提出了一个很好的问题,但没有通用的答案。通常情况下,您最好先使其工作,然后在需要时使其更快。将数组复制问题放在脑后,但在可以进行测试之前不要太担心它。

关于fortran - Fortran intent(inout) 是否传递值的副本,或指向 RAM 地址的指针/引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27304084/

相关文章:

php - MySQL自动将一个数据库表的表数据复制到另一个数据库表;当表更新或按某个特定时间间隔更新时,安排

visual-studio - Visual Studio 2015错误: exe_main.cpp not found

class - 如何覆盖用户定义的I/O过程?

python - 默认和非默认参数的顺序

interface - fortran中的INTERFACE block 和MODULE过程之间有什么区别?

子程序中的 perl foreach 循环

c++ - 如何重置已保存变量以准备下次调用的模块的状态?

c# - VS 2008 中的混合环境调试 (C# Fortran)

c - 将参数传递给 pthread_create - 从 void(*)() 到 void(*)(void*) 的无效转换

c - 将大的多维数组传递给 C 中的函数