有时人们会编写糟糕的代码——例如,可能会导致未定义行为的代码。现在假设在低优化或没有优化的情况下,未定义的行为似乎“正确”工作,但它会导致灾难性的崩溃-O3
。您将要在 调试此问题-O3
,对吗?因此,您别无选择,只能添加-g
标志并前往城镇,即使调试体验可能会因优化而受到一定程度的影响。
将“调试/发布”轴与“优化/未优化”轴混为一谈的构建系统通常存在一个大问题。确实,它们应该是正交的——例如,通常希望有一个带有日志记录的“调试”构建,但在启用优化的情况下仍然可以快速运行。同样,如果在优化的构建中没有可用的调试符号,可能很难追踪与优化器相关的错误。
+--------------------------------+
| Optimizations |
+-----------------+--------------+
| On | Off |
+----------+------+-----------------+--------------+
| | On | Debug optimized | Best debug |
| Debug | | code | experience |
| Logging/ +------+-----------------+--------------+
| Symbols | Off | Release build | Probably not |
| | | for customers | useful |
+----------+------+-----------------+--------------+