1

我在 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 的值永远不会改变,但如果编译器没有意识到这一点,它仍然会每次检查分支,以及在可执行文件中包含死的、无法访问的代码。显然这不是一个很大的区别,特别是对于分支预测,但我想知道是否可以添加这样的表达式并且实际上不需要任何成本。是否有优化设置可以做到这一点,或者默认情况下可以做到这一点?

4

1 回答 1

3

Fortran 和 C 编译器都可以(但不必)通过删除死代码进行优化。

请注意,优化是编译器的事情。语言规范只说明优化可以做什么或不能做什么。

如果您使用GCC(即gfortran用于 Fortran 代码和gccC 代码),优化通常是相同的,因为两种编译器都有不同的前端,但有一个共同的中间端和一个共同的后端。如果您在 Fortran 和 C 中编写相同的算法,它们的优化将在非常相似的内部表示上起作用。

如果没有要求,GCC 不会优化。你想传递类似-Wall -O2asgccgfortran编译器选项的东西。

于 2014-07-26T02:19:34.480 回答