我们应该禁用编译器优化,直到该程序没有错误?

时间:2014-01-23 21:26:56

标签: c optimization compiler-construction

有时编译器优化会隐藏错误;例如:

double val = sin(1.5);

如果编译器优化已启用,但数学库未链接,则会编译,因为编译器将计算sin(1.5)的值并替换它。

在程序没有错误之前禁用编译器优化是一个好习惯吗?

2 个答案:

答案 0 :(得分:3)

由于没有人把它作为答案写下来,我会一拍。

  

在程序没有错误之前禁用编译器优化是一个好习惯吗?

我不推荐它。相反,我也会定期在发布模式下测试我的代码(启用优化)。我个人遇到了一些错误,我看到很多情况下代码在调试模式下工作得很漂亮,但在发布模式下崩溃或产生了奇怪的东西。 (后面的一些错误与堆栈损坏有关。)

越早意识到自己有这样的错误就越好。你可能会更容易找到它,而你的代码记忆仍然很新鲜。

我看到的另一件事是由于代码片段中仅在调试模式下运行的副作用导致的错误。这显然是开发人员的错误,但是越早发现它,就越有可能更容易修复它。

在发布模式下开发,除非我需要调试器对我来说似乎有点过头了。在调试模式下,您可以在第三方库中获得许多有用的检查,从而减少您在调试上花费的时间。

简而言之:在调试模式下开发,但在发布模式下定期测试。

答案 1 :(得分:1)

我总是使用以下参数:所有已部署的代码都已优化。因此,通过不必要地使用未经优化的代码来阻碍开发过程没有什么意义。特别是,使用未经优化的代码进行任何性能评估是没有意义的。关闭优化器的唯一原因是能够在调试器中跟踪程序,没有别的。如果关闭优化打破了构建,那就更麻烦了,仅此而已。

更糟糕的是程序因优化而突然失败的相反效果。这就是你需要防范的效果,因为这是你的用户会生气的结果。由于巧妙的优化器和语言定义中未定义的行为相结合,这种效果很容易发生。

所以我尝试至少使用-O2进行所有测试,只有在需要使用调试器时才切换到-O0