C++内联在一个单例中被忽略,并显示在我的探查器中.怎么会

C++ _inline is being ignored in a singleton and showing up in my profiler. How come?

本文关键字:显示 我的 探查 怎么会 单例中 一个 C++      更新时间:2023-10-16

我的项目中有很多类都是由这样的单例访问的:

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

据我所知,这段代码应该是内联的。我将Visual Studio(2005)选项设置为内联任何合适的选项,并且我的探查器(AQTime)绝对没有设置为覆盖_inlines。然而,当我评测代码时,它们对我的每个单例函数都有成千上万的调用。我会错过什么?(我正在评测一个调试构建(为评测器获取符号),但所有的速度优化都已打开。)非常感谢您的任何建议!

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

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

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

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

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

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

不过,我建议不要对调试版本进行评测(如果你可以避免的话),因为VS编译器在调试和发布之间的工作方式非常不同,你可能会得到错误的结果。。。。。

首先,C++有一个inline关键字,但没有_inline_inline是宏吗?编译器特定的扩展?与你的档案相关的东西?

其次,C++编译器通常会内联它喜欢的任何内容,而inline关键字充其量是,这表明您希望看到该函数内联。

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