编译和代码优化

时间:2013-10-26 02:57:36

标签: c++ c compilation compiler-optimization

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

如果我输入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;
}

我问这个是因为我听说过编译器优化,但实际上并不是我的区域。

任何评论,评论都将受到高度赞赏。 谢谢。

5 个答案:

答案 0 :(得分:7)

由于您询问“代码优化” - 优秀的优化编译器会将此代码优化为void main(){}。 <{1}}和a将完全取消。

此外,b,而不是3.5

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

它依赖编译器,一个好的CF和/或DCE

答案 3 :(得分:1)

  

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

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

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

答案 4 :(得分:1)

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

movl    $5, -4(%rbp)

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

(另外,我让函数返回a只是为了不会完全优化代码。)