【问题标题】:Inline functions in debug build (Visual C++ 2008)调试版本中的内联函数 (Visual C++ 2008)
【发布时间】:2011-09-22 14:30:57
【问题描述】:

我正在使用的游戏引擎在调试构建时速度太慢,无法调试游戏。我想要的一件事是让编译器内联小函数(尤其是在向量/矩阵和容器类中)。这可能会也可能不会在调试构建中加速游戏。在进行大量分析并试图找出瓶颈之前,我想我会先尝试一下,因为我只需要做最少的工作,结果可能很有希望。

那么,有没有办法让 Visual C++ 编译器在调试版本中内联函数?

【问题讨论】:

    标签: c++ visual-c++ inline


    【解决方案1】:

    项目选项 -> C/C++ -> 优化 -> 内联函数扩展。将此转至/Ob2。在您的调试配置中执行此操作。

    在Release中,内联函数扩展是由其他优化设置隐含的,所以即使默认情况下所有配置都对设置说“默认”,行为确实不同。

    我相信 Debug 构建应该具有与 release 相同的内联扩展行为;真的没有理由不这样做。

    http://msdn.microsoft.com/en-us/library/47238hez.aspx

    【讨论】:

    • 感谢您的回答,我一有时间就会检查一下,然后勾选答案。
    • 我检查了这个是正确的,因为在 VS 帮助文件中没有任何迹象表明这不适用于调试版本(也没有编译器不支持的编译器标志的警告)。我能够闯入最简单的单行函数,但是在发布时我无法这样做。除非我查看汇编,否则不确定它是否是内联的。
    • 这会导致调试器“混乱”吗?
    【解决方案2】:

    您混淆了两个编译器选项。 /O 影响优化,包括内联。 /ZI 创建用于调试的 PDB 文件。它们可以独立设置。

    不过,克隆“调试”配置并使用/O1/ZI 创建“调试优化”配置可能会很有用。

    【讨论】:

    • 它们可以,是的,但是随着优化,太多的东西被优化了。例如,大多数情况下,使用优化和调试信息无法正确调试字符串。即使有调试信息,调试器也无法显示许多优化的局部变量的值。
    【解决方案3】:

    你可以试试__forceinline。请务必阅读该页面上的调试版本(关闭/Ob0 选项)。

    我怀疑这不会改变性能。如果您还没有尝试,另一件事就是将符号添加到发布版本中。它可以很好地调试很多问题。

    【讨论】:

      【解决方案4】:

      DEBUG 在调试模式下编译项目时由 Visual Studio 定义,因此:

      #ifdef DEBUG
        inline void fn() {
      #else
        void fn() {
      #endif
      

      【讨论】:

      • 问题是,inline 关键字在调试时被编译器完全忽略
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      相关资源
      最近更新 更多