C++:内联函数
原创
©著作权归作者所有:来自51CTO博客作者shanql的原创作品,请联系作者获取转载授权,否则将追究法律责任
介绍
- 在函数返回类型前加上关键字inline就可以将函数指定为内联函数。
- 内联函数可避免函数调用开销。因为内联函数将在程序每个调用点上“内联地”展开,如
cout << IsIntEqual( 10, 10 ) << endl;
在编译时将展开为cout << (static_cast<bool>(a==b)
。
inline bool IsIntEqual( int a, int b )
{
return static_cast<bool>( a == b );
}
- 内联函数适用于优化小的,只有几行的而且经常被调用的函数。
- 把内联函数放入头文件。内联函数的定义对编译器而言必须是可见的,仅有函数原型是不够的;因为内联函数会在调用处展开,所有只要使用了内联函数的地方,就有一份内联函数的代码,把内联函数放入头文件,能保证所有调用的地方展开的代码是相同的;在头文件中加入或修改内联函数,使用了此头文件的所有源文件必须重新编译。
普通函数的内联
普通函数的内联只需要在函数返回值前加上关键字inline即可。内联函数的前向声明关键字inline好像可以省略(编译运行没问题,未深度证实)
//前身声明 inline bool IsIntEqual( int a, int b );
bool IsIntEqual( int a, int b );
int main()
{
cout << IsIntEqual( 10, 10 ) << endl;
return 0;
}
inline bool IsIntEqual( int a, int b )
{
return static_cast<bool>( a == b );
}
类成员函数的内联
- 在类内部定义的成员函数,将自动作为inline处理。
- 也可以显示的在成员函数返回值前加inline。在类成员声明、定义处任意一个地方指定了inline或两者都指定,都可以使其成为内联函数。
- 像其他inline一样,inline成员函数的定义必须在调用该函数的每个源文件中可见。不在类定义体内定义的inline成员函数,其定义通常应放在有类定义的同一头文件中(要不然会出现无法找到相应符号的链接错误)。
例子:
class InlineTest
{
public:
//在类声明中定义函数,隐式地成为内联函数
int get1() const
{
return 1;
}
//显示指定inline,定义在类声明外部
inline int get2() const;
//类声明中未指定inline,但在类声明外部会显示指定
int get3() const;
//在类声明及类声明外部都显示指定
inline int get4() const;
};
int InlineTest::get2() const
{
return 2;
}
inline int InlineTest::get3() const
{
return 3;
}
inline int InlineTest::get4() const
{
return 4;
}
模板函数的内联
函数模板可以用与非模板函数一新的方式声明为inline,规则也一样。说明符放在形参表之后,返回类型之前,不能放在关键字template之前,
template<class T>
class InlineTest
{
public:
//在类声明中定义函数,隐式地成为内联函数
T get1() const
{
return 1;
}
//指定inline,定义在类声明外部
inline T get2() const;
//类声明中未指定inline,但在类声明外部会指定
T get3() const;
//在类声明及类声明外部都指定
inline T get4() const;
};
template<class T>
T InlineTest<T>::get2() const
{
return 2;
}
template<class T>
inline T InlineTest<T>::get3() const
{
return 3;
}
template<class T>
inline T InlineTest<T>::get4() const
{
return 4;
}