gpt4 book ai didi

c++ - 编译器的优化范围是什么?

转载 作者:太空狗 更新时间:2023-10-29 20:30:32 26 4
gpt4 key购买 nike

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

我们正在追查一个似乎源自优化的模糊错误。代码在 Release模式下崩溃,但在 Debug模式下不会。当然,我们知道这可能是堆损坏或其他内存问题,但我们已经追查了一段时间。我们正在考虑的一种方法是在 Debug模式下有选择地编译我们的文件,直到问题消失。换句话说:

a) 从 Release模式编译的所有文件开始
b) 在 Debug模式下编译 1/2 的文件
如果仍然看到崩溃,则取一半的发布编译文件并在 Debug模式下编译
如果没有看到crash,说一半在debug模式下编译的文件,在release模式下编译
重复直到我们缩小可疑文件的范围
这是缩小问题文件范围的二进制搜索

我们知道如果这是一个内存问题,简单地执行这种混合编译可能会使错误消失,但我们很想知道是否可以缩小问题文件的范围。

但悬而未决的问题是优化的范围是什么——它们可以跨越多个文件吗?

最佳答案

只要不改变语言定义的行为的语义,优化就可以做任何。这意味着您的第一个问题 (a)、(b) 和 (c) 的答案都是肯定的。实际上,大多数编译器并没有那么雄心勃勃,但肯定有一些例子。 Clang 和 LLVM 有 link time optimization 的标志允许优化几乎跨越整个程序。 MSVC 有一个类似的 /GL允许整个程序优化的标志。

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

祝你好运!

关于c++ - 编译器的优化范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6848959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com