C ++ _inline在单例中被忽略并显示在我的探查器中。怎么会?

时间:2011-06-23 13:02:56

标签: c++ singleton inline aqtime

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

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

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

5 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

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

其次,C ++编译器通常会内嵌任何内容,而inline关键字最好是 ,暗示您希望看到此函数内联。

今天inline关键字 的主要目的不是启用内联优化(编译器非常积极地应用它,无论你是否告诉它它取而代之,但是要压缩单一定义规则(ODR),以便可以在头文件中完全定义一个函数,而不会有来自链接器的多个定义错误的风险。