我的项目中有很多类由单身人士访问,如下所示:
_inline GUI_BS_Map* GUI_GetBS_Map()
{
static GUI_BS_Map obj;
return &obj;
};
据我了解,此代码应该内联。我将Visual Studio(2005)选项设置为内联任何合适的内容,我的探查器(AQTime)绝对不会设置为覆盖_inlines。 但是,当我对代码进行概要分析时,他们会对我的每个单例函数进行数千次调用。我能错过什么? (我正在分析调试版本(以获取探查器的符号),但启用了所有速度优化。) 任何建议都非常感谢!
答案 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),以便可以在头文件中完全定义一个函数,而不会有来自链接器的多个定义错误的风险。