2013-05-03 39 views
3

我想我知道什么内嵌关键字(看起来我没有),但与今天的编译器(Visual Studio 2012的C++编译器在我的情况),它是由编译器或编译器忽视它和内嵌其认为好的方法?它有助于将方法标记为在C++中内联吗?

+0

我们是否使用.net?后者是 – VoronoiPotato 2013-05-03 18:04:03

+1

。至少启用了优化。 – john 2013-05-03 18:04:08

+0

请记住'inline'只是一个_hint_,并不意味着内联是强制性的。 – 2013-05-03 18:04:55

回答

16

inline关键字与内联无关。它实际上意味着:该函数的多个定义可以出现在同一程序中的不同翻译单元中,而不会违反一个定义规则。

仅使用它的是,即,如果你在报头中定义的功能,然后将其标记为inline(使得多个翻译单位包括所述报头,从而生成所述功能可连接在一起)。

+1

是的,但前提是该方法是在类之外的头部定义的。 – 2013-05-03 18:07:34

+4

@ScottJones:在类中定义的成员函数隐式地作为模板函数(从ODR的角度来看)是'inline'。 – 2013-05-03 18:09:38

+1

正确 - OP可能不知道... – 2013-05-03 18:11:34

2

您提到您使用的是Visual Studio 2012,因此您可以使用某些Microsoft特定的说明符强制您想要的内联行为。

通常,编译器会使用自己的判断来确定何时应该内联函数。但是,如果您知道(因为您具有编译器无法通过静态分析源代码获得的某些应用程序的上下文或知识),因此确实应该内联内容并希望覆盖编译器的判断,则可以使用__forceinline关键字。

应当指出的是,有没有保证特定功能将被内联,即使使用__forceinline,虽然如此,它认为它是不是一个强大的建议编译器以外的任何不是安全的。

在大多数情况下,最好将决定留给编译器,如果您想根据运行时行为进一步优化,请使用类似配置文件引导优化(PGO)的选项,它将选择如何优化包括哪些内联函数),基于哪些代码路径实际上在运行时最频繁地被击中。

相关问题