我在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的值永远不会改变,但如果编译器没有意识到这一点,它仍然会每次都检查一个分支,以及在可执行文件中包含死的,无法访问的代码。显然这不是一个非常大的区别,特别是对于分支预测,但我想知道是否可以添加这样的表达式并且字面上不会花费任何成本。是否存在执行此操作的优化设置,或者默认情况下是否可以完成?
答案 0 :(得分:3)
Fortran和C编译器都可以(但不必)通过删除死代码进行优化。
请注意,优化是编译器的事情。语言规范只说明优化可以做什么或不能做什么。
如果使用GCC(即gfortran
用于Fortran代码,gcc
用于C代码),优化通常是相同的,因为两个编译器具有不同的前端但是共同的中端和共同的后端。如果您在Fortran和C中编写相同的算法,它们的优化将适用于非常相似的内部表示。
如果没有要求,GCC不会优化。您希望将-Wall -O2
作为gcc
或gfortran
编译器选项传递。