欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c++函数内联,inline关键字,使用要点

程序员文章站 2024-03-23 14:20:52
...

c++函数内联,inline关键字,使用要点

函数内联
c++语言支持函数内联,目的是为了提高函数的执行效率(速度)

c程序中可以使用宏代码提高程序执行效率,宏代码本身不是函数,使用起来像函数,预处理器使用复制宏代码的方式代替函数调用,省去了函数压栈、生成汇编语言的call调用、返回参数、执行return等过程,从而提高了速度,缺点是容易出错。对c++而言宏代码还有一种缺点:没办法调用类的私有数据成员。

c++中函数内联的工作方式:
对于任意内联函数,编译器在符号表里放入函数的声明(名字,参数类型,返回值类型),如果编译器没有发现内联函数存在错误,那么该函数的代码也会被放在符号表里,在调用一个内联函数时,编译器首先检查调用是否正确(类型安全检查,自动类型转换),如果正确,内联函数的代码就会直接顶替函数调用,省去了函数调用的开销。与预处理相比,函数内联附加的类型安全检查和自动类型转换,加入内联函数时成员函数,对象的地址(this)会被放在合适的地方,这也是预处理器办不到的。

c++语言的函数内联机制即具备宏代码的效率,又增加了安全性,而且可以*操作类的数据成员,在c++程序中,应该用内联函数取代所有宏代码。除了断言assert。

assert是仅在debug版本起作用的宏,需要保证其本身不会对代码产生影响,如果assert是函数,由于函数调用会引起内存,代码的变动,将导致debug版本和release版本代码存在差异,所以assert不能是函数,只能是宏。

内联函数的编码风格:
关键字inline必须与函数定义体放在一起才能使函数成为内联,而仅将inline放在函数声明处是没有用的。

例如:
不会发生效果的写法:
inline void foo(int x, int y);//inline仅放在函数声明处
void foo(int x, int y)
{
}

会发生效果的写法:
void foo(int x, int y);
inline void foo(int x, int y)//inline与函数定义体放在一起
{
}

所以说,inline是一种用于实现的关键字,不是用于声明的关键字。声明与定义不可混为一谈,用户没有必要野不应该知道函数是否需要内联。

例如缺省是用于声明的,而不用于定义。

定义在类声明中的成员函数将自动的成为内联函数,而基于类内声明,类外定义的良好风格,应为如下写法:

class A
{
public:
 	void foo();
};
inline void A::foo()
{
}

内联函数的缺点:
内联函数省去了函数调用的开销,但它相当于将代码段直接复制到调用处,造成了代码膨胀,调用函数只有一句,代码段可能有多句,每个调用函数的地方均被复制的代码段代替,导致实际上代码长度很长,程序的总代码量增大,消耗更多的内存空间。

不适合使用内联函数的情况:
1、函数体代码比较长,使用内联函数导致内存消耗代价较高。(量大)
2、如果函数体内出现循环,那么执行函数体内代码的时间比函数调用的开销大。(时间长)
3、类的构造函数和析构函数可能会隐藏一些行为,如执行基类的构造函数和析构函数,所以不可以随便讲类的构造函数和析构函数的定义体放在类声明中。

相关标签: c++ c++