【问题标题】:Compilation and Code Optimization编译和代码优化
【发布时间】:2013-10-26 02:57:36
【问题描述】:

我会以非常简化的形式陈述我的问题,即:

如果我输入 C

void main(){
 int a=3+2;
 double b=7/2;
}

什么时候给 a 和 b 赋值 5 和 3.5 是在我编译代码时还是在运行代码时?

换句话说,当我按下编译时会发生什么?以及它与我按下运行时的情况有何不同,在分配值和进行计算方面,这与将我的代码编写为:

void main(){
 int a=5;
 double b=3.5;
}

我问这个是因为我听说过编译器优化,但这不是我真正的领域。

任何 cmets,评论将不胜感激。 谢谢。

【问题讨论】:

  • int main(), double b=7/2, b 是 3.0 而不是 3.5。
  • 顺便说一句,7/2 是整数除法,所以 3,即使它后来转换为双精度数。您可能希望将其更改为 7/2.0
  • 啊,我错过了,谢谢。现在我很感激使用 java。
  • @Anderson:记得在编译时总是带有警告on

标签: c++ c compilation compiler-optimization


【解决方案1】:

既然您问的是“代码优化”——一个好的优化编译器会将此代码优化到void main(){}ab 将被彻底淘汰。

另外,7/2 == 3,不是 3.5

【讨论】:

    【解决方案2】:

    编译会将高级语言翻译成低级语言,例如汇编。一个好的编译器可以优化,这可以定制(例如使用-O2)选项左右。

    关于您的代码,double b=7/2; 将产生 3.0 而不是 3.5,因为您执行整数和整数运算。如果你想拥有3.5,你应该像double b=7.0/2.0; 那样做。这是人们常犯的错误。

    【讨论】:

      【解决方案3】:

      当我按下编译时会发生什么?

      没有人知道。编译器可能会将其优化为常量,也可能不会。可能会,但不是必须的。

      您通常不应该担心甚至真正考虑编译器优化,除非您处于绝对需要它的位置,而开发人员很少。编译器通常可以比你做得更好。

      【讨论】:

      • 说“没人知道”既无用也不真实。虽然它取决于编译器的优化级别,但编译器具有确定性行为。您通常可以猜测简单情况会发生什么,如果重要的话,您可以随时查看生成的程序集。
      • 除了获得文件的人之外没有人
      【解决方案4】:

      它是依赖于编译器的,一个好的可以做到CF 和/或DCE

      【讨论】:

      • 实际上,一个好的编译器会优化一切。这段代码没有副作用,所以最后 main 函数什么都不做。
      • 感谢您的回答。我问这个是因为这是真实场景的一部分,这个场景要复杂得多,因为计算是由一个 8 位微控制器完成的(每个计算步骤都会对总执行时间产生影响)。
      • @Anderson:不客气。要确保编译器是否执行此类优化,请查看文档/程序集输出(如果有)
      【解决方案5】:

      我也对优化一无所知,但我决定试一试。使用 gcc -c -S test.c 我得到了该函数的程序集。这是int a = 3 + 2 行的内容。

      movl    $5, -4(%rbp)
      

      所以对我来说,它在编译时将值 (3+2) 转换为 5,但这取决于编译器和平台以及您传递的任何标志。

      (另外,我让函数返回a,这样它就不会完全优化代码。)

      【讨论】:

      • @Anderson,不是 austin 关心的(他可能,我不知道),但如果他的评论有帮助,请给他点赞 :)
      猜你喜欢
      • 1970-01-01
      • 2016-02-14
      • 2012-06-08
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多