编译和代码优化
Compilation and Code Optimization
我将以非常简单的形式陈述我的问题,即:
如果我输入 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(){}
。 a
和b
将被完全消除。
另外,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
只是为了它不会完全优化代码。
相关文章:
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 在C++标准中做格式好意味着代码可以编译
- 为什么 std::invocable 概念阻止了此代码的编译
- 为什么我的C++代码无法编译,出现未定义的引用错误
- 生成代码(在编译时)以调用模板的每个实例化的静态函数
- C++:此代码可以编译,但引发运行时检查失败 #2 - 围绕变量周围的堆栈'num'已损坏。发生
- 代码块编译错误与运算符<<不匹配
- 我正在为学校开发一个小班模板实验室,我的代码无法编译,它给了我一个未解析的外部符号
- 代码在编译时生成三个错误
- 我只是想让我的代码正确编译
- 为什么<<低;和 cout<<v.begin;单独给出错误,但 cout <<(lower.begin());没有给出任何错误,并使代码易于编译
- 为什么这C++ STL 代码在编译中失败
- 将 ProcessEntry32.szExeFile 与用户输入的数据进行比较时,C++ _wcsicmp代码未编译
- 我的C++程序无法在Visual Studio代码上编译
- 将32位和64位应用程序(具有相同代码)编译为一个EXE
- C和C 中的代码优化
- C 代码可以编译,但在 arduino 草图中它不会
- 是否有任何情况将对象标记为 const 会导致更好的优化代码(使用优化编译时)
- 编译和代码优化
- "null logger" - 带有 ostream 运算符的空类会从优化的代码中编译出来吗?