目的:为了解决一些频繁调用的小函数大量消耗栈空间或者是叫栈内存(栈空间就是指放置程序的局部数据也就是函数内数据的内存空间,频繁大量的使用函数如死循环递归等会导致枯竭)的问题,特别的引入了inline修饰符,表示为内联涵数。
特点:
1.调用点内展开该函数
2.inline函数必须在调用该函数的每个文本文件中定义
3.建议把inline函数的定义放到头文件中:这种方法保证每个inline函数只有一个定义,无需赋值代码。
4.关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用
5.inline specifier仅仅是对编译器的建议,编译器有权利忽略这个建议。
编译器是如何决定函数内联与否呢?
一般情况下关键性因素包括函数体的大小,是否有局部对象被声明,函数的复杂性等等。
6.自动优化内联函数以及规范写法
class A
{
public:void Foo(int x, int y) { }
// 自动地成为内联函数 (类内部的函数,如果开了优化将自动优化成内联函数。)
}
将成员函数的定义体放在类声明之中虽然能带来书写上的方便,但不是一种良好的编程风格,上例应该改成:
// 头文件
class A
{
public:
void Foo(int x, int y);
}
// 定义文件
inline void A::Foo(int x, int y){}
缺点:
根本:内联是以代码膨胀(复制)为代价,会使代码量增大。如内部代码执行开销大于函数调用的占内存消耗开销,则不建议使用。
1.如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
2.如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。
优点:
根本:内联函数既能够去除函数调用所带来的效率负担又能够保留一般函数的优点。
1.内联函数看起来和普通函数一样,它可以有参数和返回值,也可以有自己的作用域,然而它却不会引入一般函数调用所带来的负担。另外, 它可以比宏更安全更容易调试。类的内联函数也是函数,编绎器在调用一个内联函数,首先会检查参数问题,保证调用正确,像对待真正函数一样,消除了隐患及局限性。
2.inline定义的内联函数,函数代码被放入符号表中,在使用时进行替换(像宏一样展开),效率很高。
3.inline可以作为类的成员函数,可以使用所在类的保护成员及私有成员。
题外:
extern inline表示该函数是已声明过的了.由于函数本身可以声明多次,所以extern对函数的影响仅仅把函数的隐藏属性显式化了.
extern 对于非函数的对象是有用的,因为对象声明时会带来内存的分配,而用 extern就表示该对象已经声明过了,不用再分配内存.
static是以前C的用法.目的是让该关键字标识的函数只在本地文件可见,同一个程序的其它文件是不可见该函数的.换句话说,就算你其它文件里包含了同名同参数表的函数定义的话,也是不会引起函数重复定义的错误的.因为static是仅在当前文件可见.
总结:
短小、结构简单、经常调用的函数携程内联函数放在.h文件中是能够提高效率的手段。但切记结构复杂代码冗长的函数写成内联函数。
特点:
1.调用点内展开该函数
2.inline函数必须在调用该函数的每个文本文件中定义
3.建议把inline函数的定义放到头文件中:这种方法保证每个inline函数只有一个定义,无需赋值代码。
4.关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用
5.inline specifier仅仅是对编译器的建议,编译器有权利忽略这个建议。
编译器是如何决定函数内联与否呢?
一般情况下关键性因素包括函数体的大小,是否有局部对象被声明,函数的复杂性等等。
6.自动优化内联函数以及规范写法
class A
{
public:void Foo(int x, int y) { }
// 自动地成为内联函数 (类内部的函数,如果开了优化将自动优化成内联函数。)
}
将成员函数的定义体放在类声明之中虽然能带来书写上的方便,但不是一种良好的编程风格,上例应该改成:
// 头文件
class A
{
public:
void Foo(int x, int y);
}
// 定义文件
inline void A::Foo(int x, int y){}
缺点:
根本:内联是以代码膨胀(复制)为代价,会使代码量增大。如内部代码执行开销大于函数调用的占内存消耗开销,则不建议使用。
1.如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
2.如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。
优点:
根本:内联函数既能够去除函数调用所带来的效率负担又能够保留一般函数的优点。
1.内联函数看起来和普通函数一样,它可以有参数和返回值,也可以有自己的作用域,然而它却不会引入一般函数调用所带来的负担。另外, 它可以比宏更安全更容易调试。类的内联函数也是函数,编绎器在调用一个内联函数,首先会检查参数问题,保证调用正确,像对待真正函数一样,消除了隐患及局限性。
2.inline定义的内联函数,函数代码被放入符号表中,在使用时进行替换(像宏一样展开),效率很高。
3.inline可以作为类的成员函数,可以使用所在类的保护成员及私有成员。
题外:
extern inline表示该函数是已声明过的了.由于函数本身可以声明多次,所以extern对函数的影响仅仅把函数的隐藏属性显式化了.
extern 对于非函数的对象是有用的,因为对象声明时会带来内存的分配,而用 extern就表示该对象已经声明过了,不用再分配内存.
static是以前C的用法.目的是让该关键字标识的函数只在本地文件可见,同一个程序的其它文件是不可见该函数的.换句话说,就算你其它文件里包含了同名同参数表的函数定义的话,也是不会引起函数重复定义的错误的.因为static是仅在当前文件可见.
总结:
短小、结构简单、经常调用的函数携程内联函数放在.h文件中是能够提高效率的手段。但切记结构复杂代码冗长的函数写成内联函数。