可能重复:
When should I write the keyword 'inline' for a function/method?
我对c ++中的内联函数有疑问。 我知道内联函数用于用内联函数体替换每个外观。 但我不知道何时使用它。据说内联函数可以提高性能,但什么时候应该考虑使用内联函数?
答案 0 :(得分:3)
内联函数最适用于性能关键且在任何地方都可以重用的小型代码存根,但写得很平常。
但是,您也可以使用它们来分割您的代码,因此您可能最终将其拆分为几个100行长的方法,而不是使用1000行长函数。您可以内联这些内容,以便它与1000行长方法具有相同的效果。
现代编译器会自动内联一些较小的方法,但是你总是可以手动内联更大的方法。
有很多相关资源,例如:
答案 1 :(得分:2)
大多数现代编译器足够聪明,可以应用内联函数的优化,可能最好让编译器决定它。
内联只是一个建议,编译器可以自由拒绝或应用它 您可以考虑在以下情况下使函数内联:
#define
答案 2 :(得分:2)
通常,现代编译器足够聪明,可以将某些小函数内联到一个限制(以空间增量表示)。您可以提供提示。当然,你会inline
小的,重复的函数来节省调用的开销。
另请注意,有时候,即使提供inline
关键字,编译器也可以决定不内联该函数,因此它的使用(至少为了优化目的)在某种程度上提供了信息。
答案 3 :(得分:2)
inline
关键字的目的是允许您在多个编译单元中定义相同的功能(通常通过在多个源文件中包含的头文件中定义它)。在某些编译器中,如果您希望编译器能够将其视为在多个编译单元中进行内联,则这是必不可少的。
因此,如果您在头文件中定义一个函数,那么您应该始终声明它inline
,否则如果该文件包含在多个源文件中,您将收到链接错误。 (如果它是类成员函数,则可以在类中定义它;它隐式声明它inline
)。如果您在源文件中定义它,那么如果您认为它是内联的良好候选者(例如,如果它很小,或者只从一个地方调用),则可以声明它inline
。
然而,编译器通常认为他们比你更了解哪些功能;有些人可能会将inline
声明作为提示,其他人可能会完全忽略它。有些人可能会提供非标准的扩展来强制(或不是)内联函数;只有当你确定(通过测量)它会改进编译器的决定时才使用它们,因为不明智的内联会损害性能。
答案 4 :(得分:1)
当你认为对函数的重复调用比简单地将函数的主体放在主代码中时(换句话说,当函数的主体很小并且函数)时,你应该使用内联函数被反复调用)。但是,编译器通常会优化代码,并且可能会忽略已定义为内联的函数。 SO上有许多其他线程可以更详细地处理这个问题。
答案 5 :(得分:0)
之前所说的一切看起来都是正确的,我只是想告诉你一个常见的错误,因为你谈到了表现。
有些程序员错误地认为“内联”=更快,因为保存了函数调用的开销。是的,节省了开销,但如果您的内联函数编译成比函数调用更大的代码(发生得非常快),整个代码将变得更大。然后,它会增加您的代码不适合处理器缓存的可能性。缓存就是今天的一切......所以你的“内联”代码实际上会运行得更慢......
我想说“内联”的使用只适用于直接在.h中编写的琐碎的getter / setter函数。
对于其他一切,我建议不要使用“内联”并让编译器自行决定。
一般建议:除了一般概念之外,在一切运行之前你不应该考虑优化,你可以测量哪些操作占用了处理时间。它通常不到代码的20%,因此您不要浪费时间盲目地优化其他所有内容。通过测量,您可以立即看到优化(例如,在这里和那里添加一些内联)是否真的有效。