我正在 VS2010 Release模式下编译一个非常小的 Win32 命令行应用程序,所有速度优化都已打开(不是内存优化)。
此应用程序旨在服务于单一目的 - 执行单个预定义的复杂数学运算,以找到特定问题的复杂解决方案。该算法功能齐全(已确认),并且在 Debug模式下编译和运行良好。但是,当我在 Release模式下编译时(算法足够大,可以利用优化),Link.exe 似乎无休止地运行,并且代码永远不会完成链接。它的 CPU 使用率为 100%,内存使用率没有变化 (43,232 K)。
我的应用程序只包含两个类,它们都是非常短的代码文件。但是,该算法包含 20 个左右的嵌套循环,每个层内都有内联函数调用。链接器是否试图通过这些循环的所有可能路径运行?如果是这样,为什么 Debug模式链接器没有任何问题?
这是一个小型命令行应用程序(2KB exe 文件),编译时间不会超过几分钟。到目前为止,我已经等了 30 分钟,没有任何变化。我正在考虑让它在一夜之间链接,但如果它真的是试图遍历算法中所有可能的代码路径,它最终可能会在没有 super 计算机的情况下链接数十年。
我需要做什么才能让链接器摆脱这个无休止的循环?这样的代码是否有可能在链接循环之前创建无限链接循环而不会出现编译器错误?
编辑:
Jerry Coffin 指出我应该杀死链接器并再次尝试。我忘了在原帖中提到这一点,但我已经中止了构建,关闭并重新打开了 VS,并尝试多次构建。问题是一致的,但我尚未更改任何链接器选项。
EDIT2:
我也忽略了提到我删除了“Debug”和“Release”文件夹并从头开始重新构建的事实。结果相同。
EDIT3:
我刚刚确认关闭函数内联会导致链接器正常运行。问题是我需要函数内联,因为这是一个对性能非常敏感的操作,内存占用最少。这让我不禁要问,为什么内联会导致这样的问题发生?
EDIT4:
在无休止的链接周期中显示的输出:
Link:
Generating code
EDIT5:
我确认将所有代码放入单个 CPP 文件并不能解决问题。
最佳答案
嵌套循环仅在链接时间代码生成方面影响链接器。有很多选项可以详细确定其工作原理。
首先,我建议完全禁用 LTCG,看看是否还有其他异常问题。
如果在禁用 LTCG 的情况下它在 Release 中链接良好,您可以尝试内联限制、内在函数和优化级别。
关于c++ - 在 Release模式下编译时,大量嵌套循环会导致链接器无休止地运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5138831/