我看过很多源代码使用了与inline
指令不同的语法。
namespace Foo
{
class Bar
{
public:
// 1 - inline on the declaration + implementation
inline int sum1(int a, int b) { return a + b; }
// 2 - inline on template declaration + implementation
template <typename T>
inline T sum2(T a, T b) { return a + b; }
// 3 - Nothing special on the declaration...
int sum3(int a, int b);
};
// 3 - But the inline directive goes after
// In the same namespace and still in the header file
inline int Bar::sum3(int a, int b) { return a + b; }
}
我没有找到关于inline
使用的“官方”指南:我只知道我对此一无所知。inline
只是对编译器的一个暗示,并强制执行内部链接。
以下是我的问题:
inline
指令吗? (我的猜测是“不”,但我无法解释原因)。什么时候需要?inline
还有其他用途(语法)吗?答案 0 :(得分:10)
不,不! inline
不是只是对编译器的提示,它不会强制执行内部链接。
inline
隐含在类主体中定义的函数上,因此您只需要在类外定义的函数上。只有当您需要对inline
生成的一个定义规则进行更改时,才应使用它。
答案 1 :(得分:3)
关于你的问题:
这似乎不是一个好用法,因为在类的主体中实现的任何成员函数都是内联隐式标记的。换句话说,这种特定的内联声明是多余的。也就是说,这个函数本身是内联的一个很好的选择,因为它很小,很短,并且可能使用更多的汇编指令来调用而不是执行。
这里没有必要使用内联关键字两个原因。首先,函数是在类的主体中实现的成员函数,因此它是隐式内联的。其次,该函数是一个模板,如果它们是非模板函数,您只需要在标题内联中标记函数。但是,由于上面给出的原因,这实际上是内联函数的一个很好的候选者。
这是内联函数的绝佳选择,您可以在这里完美地使用关键字。这是一个很短的功能,可以从中受益。
不,这就是所有语法用法。你似乎知道你在做什么! :-)
答案 2 :(得分:1)
除了在头文件中完全实现自由函数之外,不需要使用inline关键字。这指示链接器应允许存在此函数的多个(重复)符号,并且链接器应将此减少为一个实例。
答案 3 :(得分:0)
默认情况下,如果在类中声明并定义一个函数,它将是内联的。内联是对编译器的请求,编译器决定它是否内联。在内联的情况下,函数体在调用它的代码中展开。如果函数很大并且有多个循环和switch情况,那么编译器会忽略内联请求并将其视为简单函数。 简单来说,内联行为与预处理器相同,但优点和缺点是不同的。