C++:内联函数

来源:互联网 发布:mmd动作数据怎么做 编辑:程序博客网 时间:2024/05/16 03:07

介绍

  • 在函数返回类型前加上关键字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;}
原创粉丝点击