4

我的项目中有很多类由单​​例访问,如下所示:

_inline GUI_BS_Map* GUI_GetBS_Map()
{
    static GUI_BS_Map obj;
    return &obj;
};

据我了解,这段代码应该是内联的。我将 Visual Studio (2005) 选项设置为内联任何合适的选项,并且我的分析器 (AQTime) 绝对没有设置为覆盖 _inlines。但是,当我对代码进行分析时,它们对我的每个单例函数都有数千次调用。我会错过什么?(我正在分析调试版本(以获取分析器的符号),但所有速度优化都打开了。)非常感谢任何建议!

4

5 回答 5

9

编译器可以随意忽略inline_inline. 在 Visual C++ 中,您可以尝试__forceinline使编译器内联函数,除非有严重的理由不这样做(这些原因在链接的 MSDN 文章中列出)。

于 2011-06-23T13:03:54.777 回答
1

内联只是对编译器的建议。它可能会忽略您的建议,甚至是您未标记为内联的内联函数。

我建议尝试将本地静态移动到您的函数之外,重新编译并再次调试以检查您是否看到行为发生变化。似乎试图用本地静态内联这个​​函数将是一个问题。

于 2011-06-23T13:04:54.073 回答
1

inline是一种语义含义——你不能强迫编译器实际内联任何东西,它是一个实现细节,它可以嘲笑你并随时拒绝。

于 2011-06-23T13:07:19.733 回答
1

如前所述 - 编译器可以自由地忽略内联。

在 Debug 中构建以帮助调试时,也更有可能忽略任何内联调用(因此内联函数中的断点会被正确捕获等)。

不过,我建议不要分析调试版本(如果可以避免的话),因为 VS 编译器在 Debug 和 Release 之间的工作方式非常不同,您可能会得到错误的结果.....

于 2011-06-23T13:08:56.430 回答
0

首先,C++ 有一个inline关键字,但没有_inline. 是_inline宏吗?特定于编译器的扩展?与您的分析器有关的东西?

其次,C++ 编译器通常内联它喜欢的任何内容,而inline关键字最多是一个提示,您希望看到这个函数内联。

今天inline关键字的主要目的不是启用内联优化(无论你是否告诉它,编译器都会非常积极地应用它),而是抑制单一定义规则(ODR),以便一个函数可以在标头中完全定义,而不会冒链接器出现多个定义错误的风险。

于 2011-06-23T13:07:35.383 回答