在大学期间,我了解到编译器优化了我们的代码,以使可执行文件更快。例如,当一个点之后没有使用变量时,它将不会被计算。
因此,据我所知,这意味着如果我有一个调用排序算法的程序,如果打印算法的结果,那么算法将运行。但是,如果没有打印(或在其他任何地方使用),那么程序就没有理由进行该调用。
所以,我的问题是:
使用gcc进行编译时,默认情况下是否会发生这些事情(优化)?或者只有在使用O1,O2,O3标志编译代码时?
答案 0 :(得分:4)
当您第一次见到新程序时,键入man
后跟程序名称会很有帮助。当我为gcc
做的时候,它向我展示了这个:
只有在命令行上设置
-O
级别时,才会启用大多数优化。否则,即使指定了单独的优化标志,它们也会被禁用。...
-O0
减少编译时间并使调试产生预期结果。 这是默认设置。
总结一下,使用-O0
,执行路径中的所有代码都将实际执行。 (永远不会在任何执行路径中的程序文本,例如if (false) { /* ... */ }
,可能不会生成任何机器代码,但这是不可观察的。)执行的代码将感觉“按预期”,即它会做你写的。这至少是目标。