我知道内联是对编译器的提示或请求,用于避免函数调用开销。

那么,在什么基础上可以确定一个函数是否是内联的候选人? 在哪种情况下应该避免内联?


当前回答

内联函数可以通过消除将参数推入堆栈的需要来提高代码性能。 如果有问题的函数在你的代码的关键部分,你应该在项目的优化部分做出内联而不是内联的决定,

你可以在c++ FAQ中阅读更多关于内联的内容

其他回答

告诉编译器内联函数是一种优化,而最重要的优化规则是过早的优化是万恶之源。始终写清晰的代码(使用高效的算法),然后分析你的程序,只优化那些花费太长时间的函数。

如果您发现一个特定的函数非常简短,并且在一个紧凑的内部循环中被调用了数万次,那么它可能是一个很好的候选者。

不过,您可能会感到惊讶——许多c++编译器会自动为您内联小函数——而且它们可能也会忽略您的内联请求。

最好的方法是分析你的程序,把那些被多次调用并消耗CPU周期的小函数标记为内联函数。这里的关键字是“小”——一旦函数调用开销与函数中花费的时间相比可以忽略不计,那么内联它们就没有意义了。

我建议的另一种用法是,如果你有一些小函数在性能关键代码中经常被调用,以至于缓存不相关,你可能也应该内联这些函数。同样,这也是侧写师应该能够告诉你的。

我读了一些答案,发现有些东西缺失了。

我使用的规则是不使用内联,除非我希望它是内联的。看起来很傻,现在解释一下。

编译器足够聪明,短函数总是内联的。永远不要让长函数作为内联函数,除非程序员说这样做。

我知道内联是一个提示或请求编译器

实际上,内联是编译器的一个命令,它没有选择,并且在内联关键字之后使所有代码内联。所以你永远不能使用内联关键字和编译器将设计最短的代码。

那么什么时候使用内联呢?

如果您想内联一些代码,则使用。我只知道一个例子,因为我只在一种情况下使用它。即用户认证。

例如,我有这样一个函数:

inline bool ValidUser(const std::string& username, const std::string& password)
{
    //here it is quite long function
}

不管这个函数有多大,我都想把它作为内联的,因为它使我的软件更难破解。

最好的方法是检查和比较生成的内联和非内联指令。但是,省略内联总是安全的。使用内联可能会导致您不想要的麻烦。

此外,在维护大型项目时,内联方法有严重的副作用。当内联代码被更改时,所有使用它的文件将由编译器自动重建(如果它是一个好的编译器)。这可能会浪费大量的开发时间。

当内联方法被传输到源文件而不再内联时,整个项目必须重新构建(至少这是我的经验)。当方法转换为内联时也是如此。