Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 其中,将子例程/函数放入内联_Fortran_Fortran90_Gfortran - Fatal编程技术网

Fortran 其中,将子例程/函数放入内联

Fortran 其中,将子例程/函数放入内联,fortran,fortran90,gfortran,Fortran,Fortran90,Gfortran,如果我想在调用例程中内联一个子例程,我可以把它放在哪里?它需要在同一个模块或文件中吗?可以使用来自不同对象文件的子例程进行内联吗?答案可能与编译器有关吗 这不受Fortran标准的控制。处理器可以做它认为合适的事情 它肯定取决于编译器设置 通常,内部函数是内联的。但许多其他函数通常也是内联的,至少如果它们恰好位于同一源文件或模块中 但是,即使是从其他源文件/编译的对象文件进行内联也不是不可能的。这可以而且通常在链接时间优化()期间完成。这些优化要么包含在某些编译器标志中(如-fast),要么可以

如果我想在调用例程中内联一个子例程,我可以把它放在哪里?它需要在同一个模块或文件中吗?可以使用来自不同对象文件的子例程进行内联吗?答案可能与编译器有关吗

这不受Fortran标准的控制。处理器可以做它认为合适的事情

它肯定取决于编译器设置

通常,内部函数是内联的。但许多其他函数通常也是内联的,至少如果它们恰好位于同一源文件或模块中


但是,即使是从其他源文件/编译的对象文件进行内联也不是不可能的。这可以而且通常在链接时间优化()期间完成。这些优化要么包含在某些编译器标志中(如
-fast
),要么可以单独启用(
-flto
-ipo
)。

对于或多或少独立于编译器的结果,请使用内部过程(包含)。ifort的默认设置为-Qip inlines(部分?),根据inline limits设置,自动从单个编译命令中给定的所有源文件进行内联(inline)。@tim18将其放入contains语句中不便于重用,并且因为名称空间重叠。将带有小例程的模块与调用方放在同一个compile语句中看起来很干净。然后,可以重用该模块,如果调用方的调用变得耗时,可以将其与make文件中的调用方放在同一行上。我想知道这是否适用于我通常使用的编译器gfortran?内部函数指的是调用方的
包含
语句中的函数?如果能够在一个单独的文件中有一个模块,其中包含常用的小例程,如叉积、点积、一些基本函数等,并且能够假设它们是内联的,那就太好了。如果在与使用它的例程相同的语句中编译此类模块,例如
gfortran$(flags)caller.f90 utils.f90
其中utils.f90包含具有小例程的模块,则可能会有所帮助?内部过程是一个精确定义的术语。它们位于主程序或其他过程(通常是调用者)的contains部分。对于您的标志,请尝试使用
-flto
,并查看编译器如何内联。结果将取决于要内联的函数的大小。如何确定内联是否成功?我和gfortran在Ubuntu上。我刚刚使用了
gprof
perf
进行评测。