代码之家  ›  专栏  ›  技术社区  ›  sharptooth

是否允许C++编译器发出不同的机器代码来编译同一程序?

  •  7
  • sharptooth  · 技术社区  · 15 年前

    考虑一种情况。我们有一些特定的C++编译器,一组特定的编译器设置和一个特定的C++程序。

    我们用那个编译器和那个设置编译那个特定的程序两次,每次做一个“干净的编译”。

    发出的机器代码应该是相同的(我指的不是时间戳和其他的钟声和哨声,我指的是将要执行的真正的代码)还是允许它在不同的编译中变化?

    4 回复  |  直到 15 年前
        1
  •  6
  •   Jerry Coffin    5 年前

    C++标准当然没有说什么来阻止这种情况发生。然而,在现实中,编译器通常是确定性的,所以给定相同的输入,它将产生相同的输出。

    很少的 它们似乎假定构建机的特性反映了目标的特性,并基于构建环境中隐含的而不是显式声明的“输入”来改变它们的输出,例如通过编译器标志。也就是说,即使这样也相对不寻常。输出通常依赖于显式输入(输入文件、命令行标志等)

        2
  •  4
  •   BatchyX    15 年前

    根据 在标准中,只要一个符合标准的程序(例如,没有未定义的行为)不能分辨差异,编译器就可以做任何它想做的事情。换句话说,只要程序产生相同的输出,标准中就没有禁止这种情况的限制。

    从实用的角度来看,我不会使用这样的编译器来构建生产软件。我希望能够重新编译两年前发布的版本(使用相同的编译器等),并生成相同的机器代码。我不想担心我不能重现bug的原因是编译器今天决定做一些稍微不同的事情。

        3
  •  4
  •   Romain Hippeau    15 年前

    不能保证它们是一样的。同样根据 http://www.mingw.org/wiki/My_executable_is_sometimes_different

    当我编译和重新编译同一个源代码时,我的可执行文件有时是不同的。这正常吗?

    this post 这似乎解释了如何使它们相同。

        4
  •  1
  •   FrantiÅ¡ek Žiačik    15 年前