命名函数 return 值中 result 关键字的性能影响
performance implications with the result keyword in naming function return values
我正在为高性能计算编写代码。我发现使用 result 关键字来命名函数的 return 值很方便。我想知道这里是否有任何性能问题?特别是,编译器是否会为指示的 'result-name' 创建一个临时变量,最终将其复制到与函数名称关联的变量中,或者 'result-name' 只是一个别名?
我用'gfortran -S'编译了下面两段代码:
program test_result
real*8 :: a, b, c
a = 10.0
b = 20.0
c = myfunc(a, b)
contains
function myfunc(x, y)
real*8 :: myfunc
real*8 :: x, y
myfunc = x * y
end function myfunc
end program test_result
program test_result
real*8 :: a, b, c
a = 10.0
b = 20.0
c = myfunc(a, b)
contains
function myfunc(x, y) result(f)
real*8 :: f
real*8 :: x, y
f = x * y
end function myfunc
end program test_result
在没有优化的情况下,编译器给了我两个不同的汇编输出,虽然经过优化,但生成的装配线看起来是一样的。有人知道这里的含义吗?
谢谢!
不,没有任何性能损失,这只是语法问题,生成的代码是相同的。它真的只是一个 "alias".
即使禁用优化也不应该有任何差异。我的测试证实了这一点。如果您不是这种情况,您应该展示您从编译器中获得的差异。
我正在为高性能计算编写代码。我发现使用 result 关键字来命名函数的 return 值很方便。我想知道这里是否有任何性能问题?特别是,编译器是否会为指示的 'result-name' 创建一个临时变量,最终将其复制到与函数名称关联的变量中,或者 'result-name' 只是一个别名?
我用'gfortran -S'编译了下面两段代码:
program test_result
real*8 :: a, b, c
a = 10.0
b = 20.0
c = myfunc(a, b)
contains
function myfunc(x, y)
real*8 :: myfunc
real*8 :: x, y
myfunc = x * y
end function myfunc
end program test_result
program test_result
real*8 :: a, b, c
a = 10.0
b = 20.0
c = myfunc(a, b)
contains
function myfunc(x, y) result(f)
real*8 :: f
real*8 :: x, y
f = x * y
end function myfunc
end program test_result
在没有优化的情况下,编译器给了我两个不同的汇编输出,虽然经过优化,但生成的装配线看起来是一样的。有人知道这里的含义吗?
谢谢!
不,没有任何性能损失,这只是语法问题,生成的代码是相同的。它真的只是一个 "alias".
即使禁用优化也不应该有任何差异。我的测试证实了这一点。如果您不是这种情况,您应该展示您从编译器中获得的差异。