编译器中的优化范围是什么?

3 c++ memory activex

当编译器优化代码时,优化的范围是什么?优化
a)是否可以跨越一组嵌套大括号?
b)跨越多个功能?
c)跨度超过文件?

我们正在追逐一个似乎来自优化的模糊错误.代码在发布模式下崩溃但不在调试模式下崩溃.当然,我们知道这可能是堆腐败或其他内存问题bur已经追了一段时间了.我们正在考虑的一个途径是在调试模式下有选择地编译我们的文件,直到问题消失.换一种说法:

a)从在发布模式下
编译的所有文件开始b)
如果仍然看到崩溃,则在调试模式下编译1/2文件,在发布编译文件中占用一半并在调试模式下编译,
如果没有看到崩溃,请说一半在调试模式下编译的文件并在发布模式下
重复编译,直到我们缩小可疑文件,
这是一个二进制搜索,以缩小问题文件

我们知道如果这是一个内存问题,那么简单地进行这种混合编译可能会使bug消失,但是如果我们能够缩小问题文件的范围,那么我们就很容易了.

然而,突出的问题是优化的范围是什么 - 它们是否可以跨越多个文件?

Car*_*rum 5

只要不改变语言定义的行为的语义,优化就可以做任何事情.这意味着你的第一个问题(a),(b)和(c)的答案都是肯定的.在实践中,大多数编译器并不那么雄心勃勃,但肯定有一些例子.Clang和LLVM具有链接时间优化标志,允许优化跨越整个程序.MSVC具有类似的/GL标志,允许整个程序优化.

通常,这些类型的失败的原因是未初始化的变量.静态分析工具可以非常有助于找到您所描述的问题.我不确定你通过优化进行的二进制搜索是否会帮助你追踪太多,尽管有可能.您的错误可能是模块之间相当复杂的交互的结果.

祝好运!

  • +1静态分析工具,在最高警告级别编译时没有任何警告,内存调试器都是我想到的工具. (2认同)