0

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

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

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

任何意见,评论将不胜感激。谢谢你。

4

5 回答 5

7

由于您在询问“代码优化” - 一个好的优化编译器会将这段代码优化到void main(){}. a并将b被彻底淘汰。

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

于 2013-10-26T03:00:56.633 回答
2

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

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

于 2013-10-26T03:02:06.277 回答
1

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

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

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

于 2013-10-26T03:01:53.403 回答
1

我也对优化一无所知,但我决定试一试。使用,gcc -c -S test.c我得到了该功能的程序集。这就是这条线的样子int a = 3 + 2

movl    $5, -4(%rbp)

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

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

于 2013-10-26T03:09:45.027 回答
1

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

于 2013-10-26T02:59:31.933 回答