为了向你说明,编译器在 sum 函数上都做了什么。(绝对不是老老实实的调用一个函数)
我向你展示一下我的编译器(不同编译器行为可能不同)是怎么做的。
用以下代码测试
[Fortran] 纯文本查看 复制代码 use Kernel32
Implicit None
integer :: a(3) = 123 , b(3,3) = 456 , j , i
call OutputDebugString("fcode1") !// 这是为了编译后的代码中定位,没有其他作用
i = sum(a)
call OutputDebugString("fcode2")!// 这是为了编译后的代码中定位,没有其他作用
j = sum(b)
call OutputDebugString("fcode3")!// 这是为了编译后的代码中定位,没有其他作用
write(*,*) i , j
End
然后debug编译以后,可以看到,编译器分别进行了1层循环求和,和2层循环求和。
根本没有函数调用。
而且,虽然都是调用的 sum 函数,代码差不多,但编译以后的行为却完全不同(一个一层循环,一个两层循环)
我们再来看一下 release 之后的区别。
没有循环,没有函数调用。直接三个数加起来,九个数加起来。
(当然,数组大小更大一些的时候,行为又会不一样)
所以,编译器怎么做,那是编译器的事儿。程序员其实不必关心。
但是你应该知道,同样的代码,编译器的行为可能也不一样的。可能完全不是按你的代码做的。(但结果是一样的)
|