编译和代码优化

Compilation and Code Optimization

本文关键字:代码优化 编译      更新时间:2023-10-16

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

如果我输入 C

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

什么时候会为 a 和 b 分配 5 和 3.5 的值,是在我编译代码时还是在运行代码时?

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

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

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

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

既然你问的是"代码优化"——一个好的优化编译器会把这段代码优化到void main(){}ab将被完全消除。

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

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

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

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

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

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

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

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

movl    $5, -4(%rbp)

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

(此外,我使函数返回a只是为了它不会完全优化代码。