我用Fortran和C编写了一些程序,我认为C预处理器在添加或隐藏带有预处理常量的代码的灵活性方面非常漂亮。我不知道有什么方法可以用Fortran做到这一点,但我很好奇:Fortran编译器是否检测到可以在编译时删除的代码?
以以下为例:
program test_branch
implicit none
logical, parameter :: echo = .false.
integer :: n, sum
sum = 0
do n=1,100
sum = sum + n**2
if (echo) then
print *, "Sum:", sum
end if
end do
end program test_branch
echo的值永远不会改变,但如果编译器没有意识到这一点,它仍然会每次检查分支,以及在可执行文件中包括死的,不可访问的代码。显然,这不是一个很大的区别,特别是在分支预测方面,但我想知道是否可以添加这样的表达式而不需要任何成本。是否有一个优化设置可以做到这一点,或者它可能是默认的?
Fortran和C编译器都可以(但不必)通过删除死代码来优化。
注意,优化是编译器的事情。语言规范只告诉优化能做什么或不能做什么。
如果你使用GCC(即gfortran
用于Fortran代码,gcc
用于C代码),优化通常是相同的,因为两个编译器有不同的前端,但有一个共同的中间端和后端。如果你在Fortran和c中编写相同的算法,它们的优化将在非常相似的内部表示上工作。
和GCC不优化,如果没有要求。您想传递-Wall -O2
作为gcc
或gfortran
编译器选项。